LoginSignup
21
22

More than 5 years have passed since last update.

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

Posted at

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

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

21
22
0

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
  3. You can use dark theme
What you can do with signing up
21
22