我正在尝试动态设置工具栏标题,不知道是否可行。
假设我单击的每个项目都有项目列表,它是打开的新片段,因此我尝试动态更改每个项目的工具栏标题。
我尝试过:
it.findNavController().navigate(direction)
it.findNavController().currentDestination!!.label = someTitle
但这不起作用。
有一些相关主题,即:
How to set title in app bar with Navigation Architecture Component
但这不能有效地解决我的问题,这是一种解决方法。
答案 0 :(得分:3)
导航支持Navigation 1.0.0-alpha08或更高版本的标签中的参数:
目标标签与NavigationUI方法一起使用时,现在将自动将
{argName}
中的android:label
实例替换为正确的参数b/80267266
因此,您可以将标签设置为android:label="{dynamicTitle}"
,然后将参数传递给navigate
调用。在使用安全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)
当然,您可以自己listen for navigation events,并使用自己的OnDestinationChangedListener
来完成您想要的任何事情,包括将标签设置为您想要的任何事情。不需要使用NavigationUI,并且在调用NavigationUI方法之后添加的任何侦听器都将覆盖其设置。
答案 1 :(得分:1)
如果要传递自定义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()
的{{1}}检索android:name
的地方。
nav_graph.xml
我希望它可以帮助更多的人!
答案 2 :(得分:0)
您可以添加一种用于更新片段标题的方法,并在片段onStart()方法中调用它
fun updateToolbarTitle(title: String) {
supportActionBar?.title = title
}
并从nav_graph.xml中的标签中删除标签属性 这样就可以了
<fragment
android:id="@+id/myFragment"
android:name=".MyFragment"/>