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查找模型并从中读取属性 - 您将需要使用更多手动方法,例如本问题的其他答案中概述的方法.
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)
截至目前,Jetpack导航架构组件不提供任何"内置"方式来执行此操作,您必须实现自己的"自定义"方法.
现有功能请求可以为添加到新Jetpack导航架构组件的目标上的动态标签获取功能.如果您在此处是因为您需要/需要此功能,请在此处标明现有功能请求:https: //issuetracker.google.com/issues/80267266
从 graph.xml 文件中删除标签
android:label="fragment_info"
Run Code Online (Sandbox Code Playgroud)
如果您想从片段本身动态设置片段的标题,请使用老派方法
getActivity().setTitle("Your Title");
Run Code Online (Sandbox Code Playgroud)
小智 5
考虑到您的主机活动是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
}
Run Code Online (Sandbox Code Playgroud)
好吧,现在导航 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)
| 归档时间: |
|
| 查看次数: |
10688 次 |
| 最近记录: |