在选项卡选择时未调用onTabSelected方法

44

我刚刚将我的旧ActionBar迁移到了新的TabLayout(支持 Material Design)。

一切都很好,但我无法拦截选项卡选择。方法onTabSelected仅在第一次显示TabLayout时调用,但是单击标签时没有任何反应!有什么想法吗?这段代码有什么问题吗?

 tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
    mViewPager = (ViewPager) findViewById(R.id.pager);
    if (mViewPager != null) {
        setupViewPager();
    }
    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {

            numTab = tab.getPosition();
            prefs.edit().putInt("numTab", numTab).apply();

        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });

    tabLayout.setupWithViewPager(mViewPager);
2个回答

98
当您调用setupWithViewPager时,它将在内部调用setOnTabSelectedListener(new ViewPagerOnTabSelectedListener(viewPager));,覆盖您的OnTabSelectedListener
相反,您的侦听器应该扩展TabLayout.ViewPagerOnTabSelectedListener,然后重写onTabSelected()并在setupWithViewPager()之后调用setOnTabSelectedListener():
tabLayout.setupWithViewPager(mViewPager);
tabLayout.setOnTabSelectedListener(
  new TabLayout.ViewPagerOnTabSelectedListener(mViewPager) {
    @Override
    public void onTabSelected(TabLayout.Tab tab) {
        super.onTabSelected(tab);
        numTab = tab.getPosition();
        prefs.edit().putInt("numTab", numTab).apply();
    }
});

10
你说得很对,这解决了我遇到的一个相似的bug。然而,在TabLayout.OnTabSelectedListener的文档中没有提到这个事实。你的答案应该被加入到官方的Android文档中,我的主要参考应该是文档而不是Stack Overflow。再次感谢你的答案。 - Amr H. Abd Elmajeed
2
上面的答案是正确的!但是没有必要扩展监听器。只需在tabLayout.setOnTabSelectedListener之前调用tabLayout.setupWithViewPager(mViewPager)即可解决这个问题。 - Faizan Abid Naqvi
@FaizanAbidNaqvi - 如果您想在onTabSelected()中实现自定义行为,同时仍希望选项卡选择事件更改所选页面,则仍需要扩展TabLayout.ViewPagerOnTabSelectedListener - ianhanniballake
我之前一直在使用 TabLayout.OnTabSelectedListener,并且在 onTabSelected() 中执行了 viewpager.setCurrentItem,甚至不知道还有 TabLayout.ViewPagerOnTabSelectedListener 存在。谢谢。 - Muhammad Babar

3

这里是一个带有三个选项卡的更详细的示例。它使用较新的addOnTabSelectedListener而不是setOnTabSelectedListener

TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));
tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));
tabLayout.addTab(tabLayout.newTab().setText("Tab 3"));
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
final PagerAdapter adapter = new PagerAdapter
        (getSupportFragmentManager(), tabLayout.getTabCount());
viewPager.setAdapter(adapter);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
    @Override
    public void onTabSelected(TabLayout.Tab tab) {
        viewPager.setCurrentItem(tab.getPosition());
        Log.i("TAG", "onTabSelected: " + tab.getPosition());
    }

    @Override
    public void onTabUnselected(TabLayout.Tab tab) {
        Log.i("TAG", "onTabUnselected: " + tab.getPosition());
    }

    @Override
    public void onTabReselected(TabLayout.Tab tab) {
        Log.i("TAG", "onTabReselected: " + tab.getPosition());
    }
});

注:

  • onTabSelectedonTabUnselected在选项卡切换时每次都会被调用。
  • onTabReselected在已经显示的选项卡再次被点击时被调用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接