我想更改Fragment
中的“ android:label”
我试图运行以下代码来更改标签,但失败了。
val graph = findNavController().graph
graph.label = "测试"
findNavController().graph = graph
答案 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() 函数中添加以下代码行即可。
NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_container);
NavController navController= navHostFragment.getNavController();
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));
}
}
}
});