1. ホーム
  2. android

AndroidX Navigationを使ったフラグメントからの動的なActionBarのタイトル表示

2023-09-17 02:45:39

質問

私は、新しい ナビゲーション コンポーネントを使用しています。

ルートアクティビティーの設定は非常にシンプルです。

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)

    val navController = findNavController(R.id.navigationFragment)
    setupActionBarWithNavController(navController)

    bottomNavigationView.setupWithNavController(navController)
}

フラグメントのタイトルがナビゲーショングラフで定義されている場合は、うまくいきます。しかし、1つのFragmentについて、タイトルを動的に設定したいのです。

試しに findNavController().currentDestination.label = "Hello world" で試してみましたが、何も起こりません。

もちろん、次のようなトリックを使うこともできます。 (activity as? AppCompatActivity)?.supportActionBar?.title = "Hello world" の魔法が解けてしまうような気がします。 setupActionBarWithNavController() がしてくれるマジックが壊れてしまうような気がします。アクションバーのタイトルを動的に更新する方法はないでしょうか?

どのように解決するのですか?

現在のところ 1.0.0-alpha08 のように、NavigationUIビットに動的にタイトルを設定させることができます... もし動的ビットがナビゲーション・アクションの引数である場合。

ですから、たとえば、ナビゲーショングラフでは、次のようなことができます。

  <fragment
    android:id="@+id/displayFragment"
    android:name="com.commonsware.jetpack.sampler.nav.DisplayFragment"
    android:label="Title: {title}" >
    <argument
      android:name="modelId"
      app:argType="string" />
    <argument
      android:name="title"
      app:argType="string" />
  </fragment>

ここで android:label 属性は <fragment> には、中括弧で囲まれた引数名 ( {title}"Title: {title}" . そして、アプリバーのタイトルはラベルの値に設定されます。 {title} の値で置き換えられます。 title の引数に置き換えられます。

もし、それよりも手の込んだことが必要な場合、例えば、IDでモデルを検索し、そこからプロパティを読み込みたい場合、この質問に対する他の回答で説明したような、より手動のアプローチを使用する必要があります。