我想要动态设置工具栏标题,但我不知道是否可能。
假设我有一个项目列表,每次点击一个项目时都会打开一个新的片段,因此我试图为每个项目动态更改工具栏标题。
我尝试过:
it.findNavController().navigate(direction)
it.findNavController().currentDestination!!.label = someTitle
但它不起作用。
有一些相关的主题,例如:
但它不能高效地解决我的问题,这只是一个解决方法。
我想要动态设置工具栏标题,但我不知道是否可能。
假设我有一个项目列表,每次点击一个项目时都会打开一个新的片段,因此我试图为每个项目动态更改工具栏标题。
我尝试过:
it.findNavController().navigate(direction)
it.findNavController().currentDestination!!.label = someTitle
但它不起作用。
有一些相关的主题,例如:
但它不能高效地解决我的问题,这只是一个解决方法。
自Navigation 1.0.0-alpha08或更高版本开始,导航支持在标签中使用参数:
当与NavigationUI方法一起使用时,目标标签会自动将
android:label
中的{argName}
实例替换为正确的参数b/80267266
因此,您可以将标签设置为android:label="{dynamicTitle}"
,然后在navigate
调用中传入参数。由于您正在使用Safe Args,因此应向目标添加一个参数:
<fragment
android:id="@+id/myFragment"
android:name=".MyFragment"
android:label="{dynamicTitle}">
<argument
android:name="dynamicTitle"
app:argType="string"/>
</fragment>
在构建指令时,将您的动态标题传递:
val directions = YourDirections.actionToMyFragment(someTitle)
it.findNavController().navigate(directions)
当然,你可以自己监听导航事件,并使用自己的OnDestinationChangedListener
来做任何你想做的事情,包括将标签设置为你想要的内容。没有必要使用NavigationUI,调用NavigationUI方法后添加的任何监听器都会覆盖它所设置的内容。destination.label
,它会返回 {dynamicTitle}。 - rafaelasguerrasupportActionBar?.title = getString(R.string.app_name)
或在工具栏布局中使用xml指定 app:title="@string/app_name"
,则在旋转时标题将不会重置。 - Thomas W.如果您正在传递自定义的Object
作为参数,您可以使用navController.addOnDestinationChangedListener
。
navController.addOnDestinationChangedListener(new NavController.OnDestinationChangedListener() {
@Override
public void onDestinationChanged(@NonNull NavController controller, @NonNull NavDestination destination, @Nullable Bundle arguments) {
Log.i(TAG, "onDestinationChanged");
switch (destination.getId()) {
case R.id.mainFragment:
updateToolbarAndBottomNavigation("Main Title", "Main Subtitle", View.VISIBLE);
break;
case R.id.shopFragment:
updateToolbarAndBottomNavigation("custom title", null, View.VISIBLE);
break;
case R.id.shopcartFragment:
StoreEntity store = (StoreEntity) arguments.get("storeEntity");
Log.i(TAG, "onDestinationChanged: ShopCartFragment args: "+store.getName());
updateToolbarAndBottomNavigation(store.getName(), null, View.GONE);
break;
}
}
});
private void updateToolbarAndBottomNavigation(String title, String subtitle, int visibility) {
getSupportActionBar().setTitle(title);
getSupportActionBar().setSubtitle(subtitle);
bottomNavigationView.setVisibility(visibility);
}
arguments.get()
是从nav_graph.xml
中的android:name
获取的。
<fragment
android:id="@+id/shopcartFragment"
android:name="com.myapp.ShopcartFragment"
tools:layout="@layout/fragment_shopcart" >
<argument
android:name="storeEntity" // GET ARGUMENTS NAME HERE
app:argType="com.myapp.LocalDatabase.StoreEntity" />
</fragment>
我希望它能帮助更多的人!
fun updateToolbarTitle(title: String) {
supportActionBar?.title = title
}
<fragment
android:id="@+id/myFragment"
android:name=".MyFragment"/>