とある学生の技術Blog

半分くらい自分の備忘録として…

ViewPagerを使っているActivityのToolbarのメニューをFragmentごとに変更したくて詰んだ話

今自分が開発しているアプリで、ActivityにViewPager+PagerSlidingTabStripをセットして使っているのですが、この状態でViewPagerの中のFragmentに応じてToolbarに表示するメニューを変えようとしたら詰んだので記録。

ViewPager

ViewPagerによって画面をスライドしてViewを変えることができます。ViewはFragmentで構成されています。 ここで問題なのが、FragmentがOnCreateされるタイミングです。 実際、ログを取ってみると、例えば0番目のFragmentが読み込まれた時、そのFragmentに隣り合うFragmentもOnCreateされます。 ゆえに3番目のFragmentが画面に表示された時には2番目、または4番目のFragmentが表示された時点で3番目のFragmentは生成されているので、判定ができません。

対処

結論をいいますとViewPagerにSetOnPageChangeListenerをセットすればおkです。 ただ、現在だとSetOnPageChangeListenerは非推奨になっているので実際には以下のコードのようになります。

pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

今回はFragmentごとにメニューを変更したかったのでonPageSelectedの中身に以下を記述します。

toolbar.getMenu().clear();
switch (position) {
             case 0:
                 toolbar.inflateMenu(R.menu.hoge);
                 break;
             case 1:
                 toolbar.inflateMenu(R.menu.fuga);
                 break;
             default:
                 toolbar.inflateMenu(R.menu.piyo);
                 break;
}

これでうまく表示されました。