【问题标题】:onTabSelected Selected Not CalledonTabSelected 选定未调用
【发布时间】:2015-06-17 23:42:21
【问题描述】:

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

一切都很好,但我无法拦截选项卡选择 方法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);

【问题讨论】:

    标签: android tabs


    【解决方案1】:

    当您调用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();
        }
    });
    

    【讨论】:

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

    这是一个包含三个选项卡的更完整的示例。它使用较新的<strong>add</strong>OnTabSelectedListener 而不是<strong>set</strong>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());
        }
    });
    

    注意事项:

    • 每次选项卡发生变化时都会调用onTabSelectedonTabUnselected
    • onTabReselected 在标签已显示的情况下再次单击时被调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多