TabLayout 选项卡文本在 viewPager.setCurrentItem() 后未突出显示

TabLayout tab text not highlighted after viewPager.setCurrentItem()

我的 ViewPager 附加的 TabLayout 有问题。重现步骤:

  1. 从第一个选项卡开始。
  2. Select 第二个选项卡。
  3. 按后退按钮——我的代码看到用户在第二个选项卡上并调用 viewPager.setCurrentItem(0) 以 return 用户到第一个选项卡。
  4. 但是,如图所示,第二个标签文本仍然处于选中状态,而第一个标签文本显示为灰色。 (虽然粉红色条会像它应该的那样回到第一个选项卡。)

我错过了什么?

tabLayout = (TabLayout) rootView.findViewById(R.id.tab_layout_main);
tabLayout.addTab(tabLayout.newTab().setText(getActivity().getString(R.string.main_tab_grades)));
tabLayout.addTab(tabLayout.newTab().setText(getActivity().getString(R.string.main_tab_schedule)));

viewPager = (NonSwipeableViewPager) rootView.findViewById(R.id.pager_main);
pagerAdapter = new PagerAdapterMain(getActivity(), getChildFragmentManager(), tabLayout.getTabCount());
viewPager.setAdapter(pagerAdapter);

viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
    @Override
    public void onTabSelected(TabLayout.Tab tab) {
        viewPager.setCurrentItem(tab.getPosition());
    }


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

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

您可以尝试 select 通过 tablayout 而不是 viewPager 的选项卡。

tabLayout.getTabAt(0).select();

可能是Design Library的bug。正如问题所说: https://code.google.com/p/android/issues/detail?id=192834

代码对我有用:

// mViewPager.setCurrentItem(position);

mTabLayout.getTabAt(position).select();

tabLayout.getTabAt(0).getCustomView().setSelected(true); 我觉得不是TabLayout的bug,如果你想设置第一个视图高亮,你应该像我一样调用方法,那么你设置的customView就会失效

我添加这个可以修复这个错误: tabLayout.getTabAt(0).getCustomView().setSelected(真);

面临独特的问题。当我们设置 setCurrentItem 时。它不会更改 tablayout 的选项卡。然后您必须在 viewpager 上添加 addOnPageChangeListener,您必须在其中手动 select tablayout 的选项卡以 selected viewpager 的位置。然后setupWithViewPager.

注意:setupWithViewPager需要在添加addOnPageChangeListener之后设置。天知道为什么。这是有效的。如果我之前 setupWithViewPager,它不起作用。再说一遍,全能者才知道。

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }

            @Override
            public void onPageSelected(int position) {
                viewPager.setCurrentItem(position,false);
                tabLayout.getTabAt(position).select();
            }

            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });

        /*
          NOTE: This is setup after addOnPageChangeListener. Don't know why but this is what works. Otherwise tabLayout.does not select.
        */
        tabLayout.setupWithViewPager(this.viewPager);

none 上面的工作...最终修复了设置滚动位置

tabLayout.setScrollPosition(position,0f,true);

我修复了它升级到 com.android.support:design:23.4.0 版本 23.1.0 有问题。