ナビゲーションコンポーネントがアプリの動作にどのように適合するかについて、少し混乱しています。チュートリアルでは複雑すぎないため、見た目がよく、光沢がありますが、実際のアプリに実装すると、状況が異なります。
ナビゲーション前
ナビゲーションを実装する前に、フラグメントトランザクションを手動で実行する必要がありました。これを行うために、私のフラグメントはonFragmentAction
をメインのbundle
に渡したインターフェイスActivity
を実装し、アクションに基づくアクティビティで現在のフラグメントを別のフラグメントに置き換えます。
処理が必要な2番目の部分は、上部のツールバーとBottomAppBar
です。たとえば、BottomAppBar
は、FAB
を一部のフラグメントで異なるように配置するか、他のフラグメントで非表示にする必要があります。また、上のToolBar
は、一部を展開するか、一部を折りたたむ必要があります。これを行うには、_FragmentManager.OnBackStackChangedListener
_をリッスンし、フラグメントタグgetSupportFragmentManager().getBackStackEntryAt(size - 1).getName()
に基づいてレイアウトを適宜変更します。
ナビゲーションあり
最初の部分は簡単に見える:paramsを渡して新しいフラグメントを開始する。しかし、ナビゲーションがツールバーの管理を処理できるかどうか、または自分のアクティビティから管理し続ける必要があるかどうかはわかりません。
ツールバーのタイトルは、ナビゲーショングラフ内の '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
}
}
}
Alexのソリューションは機能しますが、ツールバーを管理する目的にはお勧めしません。
ツールバーはフラグメントのレイアウトの一部である必要があり、各フラグメントは独自のツールバーを管理する必要があります。フラグメントごとに異なるメニューを膨らませることができます。ツールバーをアクティビティに含めたい場合でも、ツールバーのフォームアクティビティへの参照を(インターフェースを介して)取得し、そのアイテムをフラグメント自体に追加して操作することをお勧めします。
これにより、アクティビティとフラグメントが分離されます(これは、ナビゲーショングラフとルーターを持つことの目標の1つです)。目安として、フラグメントを削除したい場合は、アクティビティを変更する必要はありません。
あなたのフラグメントで:
NavController navHostFragment = NavHostFragment.findNavController(this);
NavigationUI.setupWithNavController(toolbar, navHostFragment);
リストアイテム(Explore Fragment
)DetailFragment
に否定され、ツールバーの[戻る]ボタンをクリックすると、MainFragment
が返されます。
メニュー項目を呼び出して別のフラグメントに到達したい場合は、項目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"
/>