LoginSignup
2

More than 3 years have passed since last update.

Navigation(AAC)でBottomNavigationどうやるの

注意

こちらはnavigationのpreview版時点での話です。リリース版では挙動が異なる可能性があるので信じないでください。

はじめに

NavigationNavigation Codelabのサンプルを見てて気になったのですが、BottomNavigationのmenu2つ目のFragment どこでアタッチしてるんや・・・?

navigationのfragment idもどこで呼ばれてるわけでも無し、Navigation使ってるからFragmentTransactionなんて呼んでるわけないし

気になったのでちょっとコード読みました。

結論

NavigationUI # setupWithNavControllerがうまいことやってくれてます

上記のメソッドの引数で

setupWithNavController(
            @NonNull final BottomNavigationView bottomNavigationView,
            @NonNull final NavController navController)

結論これに渡してあげるだけ。もう少しだけ奥を見ていきます。

NavigationUI # setupWithNaControllerの中を見るとこんなのがございます。

NavigationUI#setupWithNavController
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とかとか
めんどくさいことやらなくてもいいみたいです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2