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; }
これでうまく表示されました。