我正在使用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()
对我的魔力。有什么方法可以动态更新操作栏标题?
从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查找模型并从中读取属性,则需要使用更多的手动方法,例如该问题的其他答案中概述的方法。
您可以在活动中添加addOnNavigatedListener,并根据当前目标更改标题
截至目前,Jetpack导航体系结构组件没有提供任何“内置”方式来执行此操作,因此您必须实现自己的“自定义”方法。
考虑到您的主持人活动是MainActivity
,只需将以下代码添加到MainActivity
的onCreate
乐趣中>>
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
}
另一个解决方案是使用ViewModel和LiveData,将viewmodel附加到您的活动和片段,在viewmodel内添加一个livedata字段
从graph.xml文件中删除标签
嗯,现在导航UI支持此功能。现在ActionBar
标题会动态更改。您只需要用ActionBar
设置NavController
。
直到issue被修复,简单的监听器对我起作用:
尝试该活动的标题时,似乎会覆盖片段的标题。为了安全起见,您必须戴上onResume
。
您可以在导航图中删除android:label