使用AndroidX Navigation从Fragment动态ActionBar标题

Jon*_*nas 26 android android-jetpack android-architecture-navigation

我正在使用Android Jetpack 的新导航组件.

根Activity设置非常简单:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)

    val navController = findNavController(R.id.navigationFragment)
    setupActionBarWithNavController(navController)

    bottomNavigationView.setupWithNavController(navController)
}
Run Code Online (Sandbox Code Playgroud)

当导航图中定义了Fragment的标题时,它很有效.但对于一个片段,我想动态设置标题.

我尝试过,findNavController().currentDestination.label = "Hello world"但它没有做任何事情.

我当然可以使用类似的技巧(activity as? AppCompatActivity)?.supportActionBar?.title = "Hello world",但我觉得它会打破对我有用的魔力setupActionBarWithNavController().有没有办法动态更新动作栏标题?

Com*_*are 45

由于1.0.0-alpha08,你可以有NavigationUI位动态设置标题...如果动态位上的导航操作的参数.

因此,例如,在导航图中,您可以使用以下内容:

  <fragment
    android:id="@+id/displayFragment"
    android:name="com.commonsware.jetpack.sampler.nav.DisplayFragment"
    android:label="Title: {title}" >
    <argument
      android:name="modelId"
      app:argType="string" />
    <argument
      android:name="title"
      app:argType="string" />
  </fragment>
Run Code Online (Sandbox Code Playgroud)

这里,android:label我们的属性<fragment>有一个用大括号({title}in "Title: {title}".)包装的参数名称.然后,应用栏的标题将被设置为标签的值,并{title}替换为title参数的值.

如果您需要比这更复杂的东西 - 例如,您希望通过ID查找模型并从中读取属性 - 您将需要使用更多手动方法,例如本问题的其他答案中概述的方法.

  • 此解决方案在导航版本“ 2.1.0-alpha02”中不起作用。它直接打印`Title:{title}`作为操作栏标题。 (7认同)
  • 加上; 值绑定似乎对用大括号括起来的参数中的附加空格敏感。我注意到“{title}”会导致我的应用程序崩溃,而“{title}”则按预期工作。只是一个小问题,以防它让其他人陷入困境。 (4认同)

Pat*_*tic 22

通过将活动转换为 ,可以在片段中更改标题AppCompatActivity

科特林

(requireActivity() as AppCompatActivity).supportActionBar?.title = "Hello"
Run Code Online (Sandbox Code Playgroud)

爪哇

((AppCompatActivity) requireActivity()).getSupportActionBar().setTitle("Hello");
Run Code Online (Sandbox Code Playgroud)


Erc*_*can 11

如果您在 Activity 中的 setSupportActionBar 上使用工具栏,并且您想在片段中更改其标题,那么下面的代码可能会对您有所帮助;)

(requireActivity() as MainActivity).toolbar.title = "Title here"
Run Code Online (Sandbox Code Playgroud)


Bra*_*orn 7

截至目前,Jetpack导航架构组件不提供任何"内置"方式来执行此操作,您必须实现自己的"自定义"方法.

现有功能请求可以为添加到新Jetpack导航架构组件的目标上的动态标签获取功能.如果您在此处是因为您需要/需要此功能,请在此处标明现有功能请求:https: //issuetracker.google.com/issues/80267266


Nav*_*Rao 7

从 graph.xml 文件中删除标签

android:label="fragment_info"
Run Code Online (Sandbox Code Playgroud)

如果您想从片段本身动态设置片段的标题,请使用老派方法

getActivity().setTitle("Your Title");
Run Code Online (Sandbox Code Playgroud)


小智 5

考虑到您的主机活动是MainActivity,只需将以下代码添加到您MainActivityonCreate娱乐中

val navController = Navigation.findNavController(this, R.id.nav_host_fragment)

// setting title according to fragment
navController.addOnDestinationChangedListener { 
    controller, destination, arguments ->
        toolbar.title = navController.currentDestination?.label
}
Run Code Online (Sandbox Code Playgroud)


Hus*_*dar 5

好吧,现在导航 UI 支持此功能。现在ActionBar标题动态变化。您只需要ActionBar使用NavController.

private lateinit var appBarConfiguration: AppBarConfiguration

private lateinit var navController: NavController

override fun onCreate(savedInstanceState: Bundle?) {
    preferedTheme()
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)
    navController = findNavController(R.id.nav_controller_fragment)
    appBarConfiguration = AppBarConfiguration(navController.graph)
    setupActionBarWithNavController(navController, appBarConfiguration)
}
Run Code Online (Sandbox Code Playgroud)

并在导航图中设置操作栏标签:

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/mobile_navigation"
        app:startDestination="@id/mainFragment">

<fragment android:id="@+id/mainFragment"
          android:name="com.cinderellaman.general.ui.fragments.MainFragment"
          android:label="General"
          tools:layout="@layout/main_fragment"/>
Run Code Online (Sandbox Code Playgroud)

现在它也支持导航:

override fun onSupportNavigateUp(): Boolean {
    return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
}
Run Code Online (Sandbox Code Playgroud)