Android
TabLayout
DesignSupportLibrary

TabLayoutをViewPagerでsetupした時はOnTabSelectedListenerを使わない

More than 1 year has passed since last update.

はい、タイトルでほぼ結論です。

説明すると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とかをトリガーにする場合はどうすればいいのか。。