使用AndroidX导航的片段中的动态ActionBar标题

问题描述 投票:23回答:10

我正在使用Android Jetpack的新Navigation组件。

根活动设置非常简单:

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)
}

当在导航图中定义了片段的标题时,它会很好地工作。但是对于一个片段,我想动态设置标题。

我尝试过findNavController().currentDestination.label = "Hello world",但它什么也没做。

我当然可以使用(activity as? AppCompatActivity)?.supportActionBar?.title = "Hello world"之类的技巧,但我认为它会打破setupActionBarWithNavController()对我的魔力。有什么方法可以动态更新操作栏标题?

android android-jetpack android-architecture-navigation
10个回答
40
投票

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>

在这里,我们android:label<fragment>属性的参数名称用大括号括起来({title}中的"Title: {title}"。应用栏的标题将设置为标签的值,并替换为{title}通过title参数的值。

[如果您需要比这更复杂的内容,例如,您想通过ID查找模型并从中读取属性,则需要使用更多的手动方法,例如该问题的其他答案中概述的方法。


-1
投票

您可以在活动中添加addOnNavigatedListener,并根据当前目标更改标题


6
投票

截至目前,Jetpack导航体系结构组件没有提供任何“内置”方式来执行此操作,因此您必须实现自己的“自定义”方法。


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
}

3
投票

另一个解决方案是使用ViewModel和LiveData,将viewmodel附加到您的活动和片段,在viewmodel内添加一个livedata字段


3
投票

从graph.xml文件中删除标签


3
投票

嗯,现在导航UI支持此功能。现在ActionBar标题会动态更改。您只需要用ActionBar设置NavController


1
投票

直到issue被修复,简单的监听器对我起作用:


0
投票

尝试该活动的标题时,似乎会覆盖片段的标题。为了安全起见,您必须戴上onResume


0
投票

您可以在导航图中删除android:label

© www.soinside.com 2019 - 2024. All rights reserved.