web-dev-qa-db-ja.com

Android Jetpack Navigationツールバーと下部のナビゲーションバーのコンテンツを処理する方法

ナビゲーションコンポーネントがアプリの動作にどのように適合するかについて、少し混乱しています。チュートリアルでは複雑すぎないため、見た目がよく、光沢がありますが、実際のアプリに実装すると、状況が異なります。

ナビゲーション前

ナビゲーションを実装する前に、フラグメントトランザクションを手動で実行する必要がありました。これを行うために、私のフラグメントはonFragmentActionをメインのbundleに渡したインターフェイスActivityを実装し、アクションに基づくアクティビティで現在のフラグメントを別のフラグメントに置き換えます。

処理が必要な2番目の部分は、上部のツールバーとBottomAppBarです。たとえば、BottomAppBarは、FABを一部のフラグメントで異なるように配置するか、他のフラグメントで非表示にする必要があります。また、上のToolBarは、一部を展開するか、一部を折りたたむ必要があります。これを行うには、_FragmentManager.OnBackStackChangedListener_をリッスンし、フラグメントタグgetSupportFragmentManager().getBackStackEntryAt(size - 1).getName()に基づいてレイアウトを適宜変更します。

ナビゲーションあり

最初の部分は簡単に見える:paramsを渡して新しいフラグメントを開始する。しかし、ナビゲーションがツールバーの管理を処理できるかどうか、または自分のアクティビティから管理し続ける必要があるかどうかはわかりません。

14
Alin

ツールバーのタイトルは、ナビゲーショングラフ内の 'label'値に基づいて設定されます。ツールバーまたはBottomAppBarで別のことを実行したい場合は、アクティビティ内にaddOnNavigatedListenerを追加し、現在の宛先に基づいて何かを実行できます。

findNavController(nav_Host_fragment).addOnNavigatedListener { controller, 
 destination ->
 when(destination.id) {
    R.id.destination1 -> {
        //Do something with your toolbar or BottomAppBar
    }
    R.id.destination2 -> {
        //Do something with your toolbar or BottomAppBar
    }

 }
}
5
Alex

Alexのソリューションは機能しますが、ツールバーを管理する目的にはお勧めしません。

ツールバーはフラグメントのレイアウトの一部である必要があり、各フラグメントは独自のツールバーを管理する必要があります。フラグメントごとに異なるメニューを膨らませることができます。ツールバーをアクティビティに含めたい場合でも、ツールバーのフォームアクティビティへの参照を(インターフェースを介して)取得し、そのアイテムをフラグメント自体に追加して操作することをお勧めします。

これにより、アクティビティとフラグメントが分離されます(これは、ナビゲーショングラフとルーターを持つことの目標の1つです)。目安として、フラグメントを削除したい場合は、アクティビティを変更する必要はありません。

15
Kayvan N

あなたのフラグメントで:

NavController navHostFragment = NavHostFragment.findNavController(this);
NavigationUI.setupWithNavController(toolbar, navHostFragment);

enter image description here

リストアイテム(Explore FragmentDetailFragmentに否定され、ツールバーの[戻る]ボタンをクリックすると、MainFragmentが返されます。

4
Nhật Trần

メニュー項目を呼び出して別のフラグメントに到達したい場合は、項目IDに、宛先IDにあるものと同じIDを与える必要があります。

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return 
       item.onNavDestinationSelected(findNavController(R.id.nav_Host_fragment))
            || super.onOptionsItemSelected(item)
}


<item Android:id="@+id/dailyInfoFragment"
      Android:title="@string/action_settings"
      Android:orderInCategory="100"
      app:showAsAction="never"/>


    <fragment
        Android:id="@+id/dailyInfoFragment"
        Android:name="com.example.sonyadmin.infoPerDay.DailyInfoFragment"
        Android:label="fragment_daily_info"
        tools:layout="@layout/fragment_daily_info"
        />