android.support.design.widget.TabLayout программно выбирает вкладку

Я использую android.support.design.widget.TabLayout. У него есть две вкладки. Если пользователь выбирает вторую вкладку, при определенном условии я хочу, чтобы пользователь перенаправлялся на первую вкладку и запрещал ему переходить на вторую вкладку, пока условие не совпадет. Чтобы добиться этого, я пытался,

tabLayout.getTabAt(0).select(); 

но он не выбирает первую вкладку


person Pankaj    schedule 08.08.2015    source источник
comment
Вместо того, чтобы позволять им перемещаться, а затем перенаправлять их, может быть проще отключить выбор вкладок до тех пор, пока не будут выполнены критерии: stackoverflow.com/questions/4497187/   -  person Quintin Balsdon    schedule 08.08.2015
comment
@QuintinBalsdon, спасибо, но пример в вашей ссылке связан с TabHost. Он имеет метод setEnable() в tabhost.getTabwidget. Я использую новый TabLayout в библиотеке поддержки.   -  person Pankaj    schedule 09.08.2015


Ответы (7)


Это связано с тем, что это представление все еще не инициализировано должным образом, а вы пытаетесь выполнить какое-то действие.

В качестве решения вам просто нужно поместить один хадлер перед выбором конкретной вкладки.

new Handler().postDelayed(
    new Runnable(){
        @Override
        public void run() {
            tabLayout.getTabAt(yourTabIndex).select();
        }
}, 100);
person Mihir Palkhiwala    schedule 10.08.2015
comment
есть ли возможность прослушать событие (т.е. onCreationComplete) ... чтобы реализовать решение, основанное на событии, вместо использования жестко закодированного таймера? - person nish; 22.12.2016
comment
Я думаю, что нет такого метода для этого. - person Mihir Palkhiwala; 22.12.2016
comment
Я думаю, что решил это без жестко запрограммированного таймера, см. мой ответ - person Actine; 08.07.2018

Вот как я это решил:

tabLayout.getTabAt(CurrentItem).getCustomView().setSelected(true);
person Alireza Ghanbarinia    schedule 08.03.2016

Это сработало для меня:

int tabIndex = 2;
tabLayout.setScrollPosition(tabIndex,0f,true);
viewPager.setCurrentItem(tabIndex);
person Alex Jolig    schedule 23.12.2017

Это моя установка. отлично работает для меня.

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

не забудьте инициализировать макет вкладки выше.

person vikas kumar    schedule 12.04.2017

Вы можете выбрать вкладку в Fragment.onViewCreated().

person Nimo    schedule 10.01.2016

Слишком поздно, но это может помочь другим разработчикам.

Если вы зайдете внутрь и увидите, как tabLayout.getTabAt(tabIndex).select(); реализовано внутри. Вы узнаете, что это посылает ваш поток

onTabReselected(tab: TabLayout.Tab?)

и ваш поток не идет в

onTabSelected(tab: TabLayout.Tab?)

если ваша текущая вкладка и tabIndex совпадают. Так что это очень важно учитывать.

person Abhishek Kumar    schedule 11.10.2019

Ответ Михир дал мне идею попробовать это. Похоже, он работает без жестко заданного таймера, а также правильно обновляет прокрутку для выбранной вкладки:

final TabLayout tabLayout = ...;
tabLayout.postOnAnimation(new Runnable() {
    @Override
    public void run() {
        tabLayout.getTabAt(2).select();
    }
});
person Actine    schedule 08.07.2018