#注意
こちらはnavigationのpreview版時点での話です。リリース版では挙動が異なる可能性があるので信じないでください。
#はじめに
NavigationのNavigation Codelabのサンプルを見てて気になったのですが、BottomNavigationのmenu2つ目のFragment どこでアタッチしてるんや・・・?
navigationのfragment idもどこで呼ばれてるわけでも無し、Navigation使ってるからFragmentTransactionなんて呼んでるわけないし
気になったのでちょっとコード読みました。
#結論
NavigationUI # setupWithNavControllerがうまいことやってくれてます
上記のメソッドの引数で
setupWithNavController(
@NonNull final BottomNavigationView bottomNavigationView,
@NonNull final NavController navController)
結論これに渡してあげるだけ。もう少しだけ奥を見ていきます。
NavigationUI # setupWithNaControllerの中を見るとこんなのがございます。
navController.addOnNavigatedListener(new NavController.OnNavigatedListener() {
@Override
public void onNavigated(@NonNull NavController controller,
@NonNull NavDestination destination) {
int destinationId = destination.getId();
Menu menu = bottomNavigationView.getMenu();
for (int h = 0, size = menu.size(); h < size; h++) {
MenuItem item = menu.getItem(h);
if (item.getItemId() == destinationId) {
item.setChecked(true);
}
}
}
});
**あ、僕もこんなの書いたことある!( ゚д゚ )**ってのが出てきました。
どうやらmenu idとnavigation.xmlのfragmentやactivityに設定したidで紐づけているようですね。
navigationのidはnavigationファイルでファイルの紐づけを行うと自動で採番されるので、menuファイルで命名をミスらないように気をつけないといけないようですね。
#最後に
サンプルにもありますが、NavigationView(Drawer)やActionBarなどもNavigationUIクラスにあるので、
navigationファイルとその他必要なファイルさえあれば、Drawerのクリックとか、setSupportActionBarとかとか
めんどくさいことやらなくてもいいみたいです。