Android支持设计库中的TabLayout如何以编程方式选择选项卡

24

我正在使用android.support.design.widget.TabLayout。 它有两个选项卡, 如果用户选择第二个选项卡,并且满足特定条件,我希望将用户重定向到第一个选项卡,并禁止其访问第二个选项卡,直到条件匹配。 为了实现这一点,我尝试了以下内容:

tabLayout.getTabAt(0).select(); 

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


与其让用户导航,然后再重定向他们,禁用选项卡选择直到满足条件可能更容易:https://dev59.com/NW855IYBdhLWcg3wKxDc - Quintin Balsdon
1
@QuintinBalsdon,谢谢, 但是你链接中的示例与TabHost相关。tabhost.getTabwidget中有setEnabled()方法。 我正在使用support库中的新TabLayout。 - Pankaj
8个回答

53

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

解决方法只需在选择特定选项卡之前放置一个处理程序即可。

new Handler().postDelayed(
    new Runnable(){
        @Override
        public void run() {
            tabLayout.getTabAt(yourTabIndex).select();
        }
}, 100);

1
有没有可能监听事件(例如onCreationComplete)..以实现基于事件的解决方案,而不是使用硬编码计时器? - nish
1
我猜没有这样的方法。 - Mihir Palkhiwala
我认为我已经解决了它,而没有使用硬编码的计时器,请查看我的答案 - Actine

3
这是我的解决方案:
tabLayout.getTabAt(CurrentItem).getCustomView().setSelected(true);

2
这对我有用:
int tabIndex = 2;
tabLayout.setScrollPosition(tabIndex,0f,true);
viewPager.setCurrentItem(tabIndex);

0
tabLayout.getTabAt(index specific).select();

0
你可以在 Fragment.onViewCreated() 中选择选项卡。

0

虽然现在已经有点晚了,但这可能会对其他开发人员有所帮助。

如果你进入内部并查看tabLayout.getTabAt(tabIndex).select();的实现方式,你就会知道它将你的流程发送到

onTabReselected(tab: TabLayout.Tab?)

如果您的流程不会进入

onTabSelected(tab: TabLayout.Tab?)

如果您的当前选项卡选项卡索引相同,则这非常重要。


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

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


-1
Mihir的回答给了我一个尝试的想法。似乎它可以在没有硬编码计时器的情况下工作,并且还可以正确地更新所选选项卡的滚动条:
final TabLayout tabLayout = ...;
tabLayout.postOnAnimation(new Runnable() {
    @Override
    public void run() {
        tabLayout.getTabAt(2).select();
    }
});

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