使用导航组件动态设置工具栏标题

Ibr*_*Ali 10 android android-architecture-components android-architecture-navigation

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

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

我试过 :

it.findNavController().navigate(direction)
it.findNavController().currentDestination!!.label = someTitle
Run Code Online (Sandbox Code Playgroud)

但它不起作用。

有一些相关的主题,即:

如何使用导航架构组件在应用栏中设置标题

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

ian*_*ake 22

Navigation 1.0.0-alpha08或更高版本开始,Navigation 支持标签中的参数:

目的地标签,当与 NavigationUI 方法一起使用时,现在会自动用正确的参数替换{argName}你的实例b/80267266android:label

因此,您可以将标签设置为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>
Run Code Online (Sandbox Code Playgroud)

然后在构建路线时传入您的动态标题:

val directions = YourDirections.actionToMyFragment(someTitle)
it.findNavController().navigate(directions)
Run Code Online (Sandbox Code Playgroud)

当然,你可以自己监听导航事件,用你自己OnDestinationChangedListener的来做你想做的任何事情,包括将标签设置为你想要的任何内容。不需要使用 NavigationUI,并且在调用 NavigationUI 方法后添加的任何侦听器都将覆盖它设置的任何内容。

  • 我发现这种方法存在问题,如果设备旋转(活动/视图被破坏,标题将被重置(将变为空白)。如果您能够重现,请告诉我 (2认同)