如何在Fragment中动态更改标签?

时间:2019-06-18 02:48:28

标签: android navigation jetpack

我想更改Fragment中的“ android:label”

我试图运行以下代码来更改标签,但失败了。

val graph = findNavController().graph
graph.label = "测试"
findNavController().graph = graph

3 个答案:

答案 0 :(得分:1)

根据Navigation UI documentation,NavigationUI方法(例如setupActionBarWithNavController()方法)依赖于OnDestinationChangedListener,每次您navigate()到新目的地时都会调用该方法。这就是为什么标签不会立即更改的原因-仅在导航到新目的地时才会更新。

文档确实针对the top app bar进行了说明:

  

通过使用标签中的{argName}格式,可以自动从提供给目标的参数中填充附加到目标的标签。

这使您可以将标签所用的字符串(例如R.string.destination_label)更新为

<string name="destination_label">You are on {destination}</string>

通过在目的地上使用相同的argument,您的标题将自动填充正确的信息。

当然,如果您没有可以提前确定的参数,那么您将希望完全避免在目标位置设置android:label,而是手动更新操作栏的标题,等等。

答案 1 :(得分:0)

navController.addOnDestinationChangedListener((controller, destination, arguments) -> {
        destination.setLabel("Bruno is here");

    });

答案 2 :(得分:0)

只需在托管活动的 onCreate() 函数中添加以下代码行即可。

  1. 获取 NavController 的引用,这里我使用 NavHostFragment 获取 NavController 的引用,您也可以使用其他方式。
NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_container);

NavController navController= navHostFragment.getNavController();
  1. 将 addOnDestinationChangedListener 添加到 NavController 并根据参数中接收到的数据项更改标签。
navController.addOnDestinationChangedListener( new NavController.OnDestinationChangedListener() {
                @Override
                public void onDestinationChanged(@NonNull NavController controller, @NonNull NavDestination destination, @Nullable Bundle arguments) {
                    if (destination.getId() == R.id.fragmentID) {
                        if (arguments != null) {
                            DataItem item = FragmentArgs.fromBundle(arguments).getItem();
                            if (item != null)
                                destination.setLabel(getString(R.string.your_label));
                            else
                                destination.setLabel(getString(R.string.other_label));
                        }
                    }

                }
            });