viewpager setCurrentItem未改变tablayout选中颜色

9

我正在使用ViewPager和TabLayout

     viewPager.setAdapter(Adapter);
   tablayout.setupWithViewPager(viewPager);

   viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        int cPage;

        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        }

        @Override
        public void onPageSelected(int position) {


                cPage = position;

        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

现在我滑动选定的标签时,颜色会改变,但当我调用…
                viewPager.setCurrentItem(1, true);

它没有改变新标签页的布局颜色。例如,当我有2个标签页时,当我在第一个标签页时,它会将文本颜色设置为绿色,并且当我滑动时,第二个标签页也会变成绿色...但是当我调用时,它没有改变。

            viewPager.setCurrentItem(1, true);

在这里,我的第一个选项卡是绿色的,而不是第二个选项卡。

你目前使用的支持库版本是什么? - kopikaokao
com.android.support:design:23.1.1 - andro
如果我使用tab.setScrollPosition(0,0f,true);,那么它可以工作,但是为什么我要调用它呢? - andro
遇到完全相同的问题。而且,标题栏确实会随所选标签的位置而改变。只是标题颜色不会变。似乎无法解决这个问题。 - SilverHood
4
使用这个代码 @silverHood:tab.setScrollPosition(pos,0f,true);。它的作用是设置一个滚动位置,第一个参数是位置值,第二个参数是偏移量,第三个参数为true表示平滑过渡到新的位置。 - andro
显示剩余2条评论
7个回答

6

我试过这个方法,很有效...

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

6

1
如果您的选项卡中有片段,则此方法无效。不幸的是,这种显而易见的方法行不通。需要使用延迟 viewPager.setCurrentItem() + tabLayout.setScrollPosition() 的技巧。Sabeer Mohammed的答案是正确的。 - Zon

3

在你的活动中:

 // init TabLayout
        TabLayout tabLayout = (TabLayout) view.findViewById(R.id.tab_layout);
        if (mCallFrom.equalsIgnoreCase(ActivityConstantUtils.sCalledFromActPanel)) {
            // To add Memory
            tabLayout.addTab(tabLayout.newTab().setText(R.string.add_memory_caption));
            tabLayout.addTab(tabLayout.newTab().setText(R.string.add_memory_effects));
//            tabLayout.addTab(tabLayout.newTab().setText(R.string.add_memory_frames));
        } else {
            // To add Memory from Recipe & Blog
            tabLayout.addTab(tabLayout.newTab().setText(R.string.add_memory_caption));
            tabLayout.setSelectedTabIndicatorColor(Color.TRANSPARENT);
        }
        changeTabsFont(tabLayout);
        showDivider(tabLayout);
        tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
        final ViewPager viewPager = (ViewPager) getActivity().findViewById(R.id.pager);
        final PagerAdapter adapter = new PagerAdapter(this.getFragmentManager(), tabLayout.getTabCount());
        viewPager.setAdapter(adapter);
        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                if (tab.getPosition() == 1) {
                    Utils.hideSoftKeyboard(view, getActivity());
                }
                viewPager.setCurrentItem(tab.getPosition());
            }

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

            }

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

            }
        });

//TabLayout应用的样式

<style name="ActPanelTabLayout.Theme" parent="Widget.Design.TabLayout">
        <item name="tabIndicatorColor">@color/memory_color_80</item>\
        <item name="android:textColor">@color/act_tab_black</item>
        <item name="tabSelectedTextColor">@color/act_tab_selector_text_color</item>
        <item name="tabTextAppearance">@style/TextAppearance.Jacksonville.ActTab</item>
    </style>

2
我的问题是当我调用setcurrentitme时,只有那个时间。 - andro

1
遇到了一个独特的问题。当我们设置setCurrentItem时,它不会更改tablayout的选项卡。然后,您必须在viewpager上添加addOnPageChangeListener,在其中必须手动选择tablayout的选项卡以选定viewpager的位置。然后设置setupWithViewPager。
注意:只有在添加addOnPageChangeListener之后才需要设置setupWithViewPager。上帝知道为什么。这就是起作用的方法。如果我先设置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);

0

我也遇到了同样的问题,即当我们滑动ViewPager时,TabLayout中的选项卡未被选中,即当我们滑动ViewPager时,选项卡保持不变。

解决方案(Kotlin):

viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
        override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}

        override fun onPageSelected(position: Int) {
            viewPager.setCurrentItem(position, false)
            tabLayout.getTabAt(position)?.select()
        }

        override fun onPageScrollStateChanged(state: Int) {}
    })

0

viewPager.setCurrentItem(1, true); 必须在UI线程上运行


-1
这是Design支持库中众所周知的bug,即使在版本24.1.1中仍然存在。我能够通过将CoordinatorLayout用作父(根)布局来找到解决此问题的方法。

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