Android 未调用已选择的未调用

Android 未调用已选择的未调用,android,tabs,Android,Tabs,我刚刚将旧的ActionBar迁移到新的TabLayout(支持材料设计) 一切都很好,但我无法拦截选项卡选择 只有在第一次显示TabLayout时才会调用方法onTabSelected,但单击选项卡时,不会发生任何事情! 知道这个代码有什么问题吗 tabLayout = (TabLayout) findViewById(R.id.tabs); tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE); mViewPager = (View

我刚刚将旧的
ActionBar
迁移到新的
TabLayout
(支持材料设计)

一切都很好,但我无法拦截选项卡选择 只有在第一次显示
TabLayout
时才会调用方法
onTabSelected
,但单击选项卡时,不会发生任何事情! 知道这个代码有什么问题吗

 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);

调用
setupWithViewPager
时,将在内部调用
setOnTabSelectedListener(新的ViewPagerOnTabSelectedListener(viewPager)),覆盖您的
OnTabSelectedListener

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());
    }
});
相反,您的侦听器应该扩展,然后覆盖
onTabSelected()
,并在
setupWithViewPager()之后调用
setOnTabSelectedListener()


下面是一个更完整的示例,有三个选项卡。它使用较新的
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());
    }
});
注:

  • 每当选项卡发生更改时,都会调用
    onTabSelected
    onTabUnselected
  • onTabReselected
    在选项卡已显示时,只要再次单击该选项卡,就会调用该选项卡

你说得对,这为我解决了一个类似的错误。但是,TabLayout.ontAbsSelectedListener的文档中没有提到这一事实。您的答案应该放在android官方文档中。我的主要引用应该是文档,而不是堆栈溢出。再次感谢您的回答。以上答案是正确的!但是没有必要扩展侦听器。在tabLayout.setOnAbsSelectedListener解决此问题之前,只需调用tabLayout.setupWithViewPager(mViewPager)。@FaizanAbidNaqvi-如果希望在
ontAbsSelected()中自定义行为,您仍然需要扩展
tabLayout.viewPageronAbsSelectedListener
但仍然希望选项卡选择事件更改所选页面。我以前使用过这个
TabLayout.OnTabSelectedListener
,在
onTabSelected()
内执行
viewpager.setCurrentItem
,甚至不知道这个
TabLayout.ViewPagerOnTabSelectedListener
存在。谢谢