使用导航组件

时间:2019-04-16 04:50:51

标签: android android-architecture-components android-architecture-navigation

我正在尝试动态设置工具栏标题,不知道是否可行。

假设我单击的每个项目都有项目列表,它是打开的新片段,因此我尝试动态更改每个项目的工具栏标题。

我尝试过:

it.findNavController().navigate(direction)
it.findNavController().currentDestination!!.label = someTitle

但这不起作用。

有一些相关主题,即:

How to set title in app bar with Navigation Architecture Component

但这不能有效地解决我的问题,这是一种解决方法。

3 个答案:

答案 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"/>