24

我正在使用 android.support.design.widget.TabLayout。它有两个选项卡,如果用户在特定条件下选择第二个选项卡,我希望用户重定向到第一个选项卡并不允许他转到第二个选项卡,直到条件匹配。为了实现这一点,我尝试了,

tabLayout.getTabAt(0).select(); 

但它不会重新选择第一个选项卡

4

8 回答 8

53

这是因为该视图仍未正确初始化,并且您正在尝试执行某些操作。

作为一种解决方案,您只需要在选择特定选项卡之前放置一个 hadler

new Handler().postDelayed(
    new Runnable(){
        @Override
        public void run() {
            tabLayout.getTabAt(yourTabIndex).select();
        }
}, 100);
于 2015-08-10T12:15:34.620 回答
3

这就是我解决它的方法:

tabLayout.getTabAt(CurrentItem).getCustomView().setSelected(true);
于 2016-03-08T19:33:49.743 回答
2

这对我有用:

int tabIndex = 2;
tabLayout.setScrollPosition(tabIndex,0f,true);
viewPager.setCurrentItem(tabIndex);
于 2017-12-23T09:52:53.397 回答
0

您可以选择 中的选项卡Fragment.onViewCreated()

于 2016-01-10T13:49:40.127 回答
0

这是我的设置。对我来说很好。

      //declare your tabs to be add on
        TabLayout tlDailyView;
        private TabLayout.Tab tabAppointment, tabSlots;


    @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_daily_view, container, false);
            initializeMembers();
            setupTabLayout();
            return view;
        }


    private void setupTabLayout() {
            tlDailyView.addTab(tabAppointment, 0, true);
            tlDailyView.addTab(tabSlots, 1, true);
            tlDailyView.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
                @Override
                public void onTabSelected(TabLayout.Tab tab) {

                    switch (tab.getPosition()) {
                        case 0:
                        //open fragment at position 0 here
                        case 1:
                        //open fragment at position 1 here
                            break;
                    }

                }

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

                }

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

                }
            });
        }

 private void initializeMembers() {
        tabSlots = tlDailyView.newTab();
        tabAppointment = tlDailyView.newTab();
        tabAppointment.setText(R.string.tab_appts).select();
        tabSlots.setText(R.string.tab_slots);
    }

不要忘记初始化上面的选项卡布局。

于 2017-04-12T10:43:17.747 回答
0
tabLayout.getTabAt(index specific).select();
于 2019-06-14T19:53:41.377 回答
0

为时已晚,但它可能会帮助其他开发人员。

如果你进去看看里面是怎么tabLayout.getTabAt(tabIndex).select();实现的。你会知道,它会将你的流量发送到

onTabReselected(tab: TabLayout.Tab?)

你的流量不会去

onTabSelected(tab: TabLayout.Tab?)

如果您当前的选项卡tabIndex相同。所以这是非常重要的考虑。

于 2019-10-11T13:27:36.400 回答
-1

米希尔的回答给了我一个尝试这个的想法。似乎它可以在没有硬编码计时器的情况下工作,并且还可以正确更新所选选项卡的滚动:

final TabLayout tabLayout = ...;
tabLayout.postOnAnimation(new Runnable() {
    @Override
    public void run() {
        tabLayout.getTabAt(2).select();
    }
});
于 2018-07-08T14:28:40.287 回答