はい、タイトルでほぼ結論です。
説明するとAndroidのDesignSupportLibraryのTabLayoutではsetupWithViewPagerというmethodがあって、これで生成するとViewPagerと関連づけてくれます。
その説明に
The one-stop shop for setting up this TabLayout with a ViewPager.
This method will:
* Add a ViewPager.OnPageChangeListener that will forward events to this TabLayout. * Populate the TabLayout's tabs from the ViewPager's PagerAdapter. * Set our TabLayout.OnTabSelectedListener which will forward selected events to the ViewPager
と、「libraryのOnTabSelectedListenerを設定して使ってね」とちゃんと書いてあるのですが、気づかなかったのでメモします。
使ったversionは23.1.0です。
動かない
TabLayoutにはViewPagerと関連づいたOnTabSelectedListenerがすでに追加されています。
なのでsetOnTabSelectedListenerとかで自分のListenerをセットしてしまうとタブとviewPagerの連動が切れてしまいます。
mMyPagerAdapter = new MyPagerAdapter(getSupportFragmentManager());
mViewPager.setAdapter(mMyPagerAdapter);
// AdapterをセットしたViewPagerからTabLayoutを設定する
mTabLayout.setupWithViewPager(mViewPager);
// これをすると上書きしてしまって連動機能が動かなくなる
mTabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
// 何かしたい
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
動く
タブ切り替えはViewPagerに完全連動しているのでViewPagerの方にListenerを追加します。
method名からもViewPagerは複数Listener登録にも対応しているので競合しないだけかもしれませんね。
mMyPagerAdapter = new MyPagerAdapter(getSupportFragmentManager());
mViewPager.setAdapter(mMyPagerAdapter);
// ViewPagerの方にListenerを設定すれば問題なさそう
mViewPager.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) {
}
});
mTabLayout.setupWithViewPager(mViewPager);
今回はselectedイベントだけトリガーにしたかったので特に問題なかったですが、
UnselectedとかReselectedとかをトリガーにする場合はどうすればいいのか。。