android.support.design.widget.TabLayout以编程方式选择Tab

时间:2015-08-08 08:24:40

标签: android android-tablayout

我正在使用android.support.design.widget.TabLayout。 它有两个标签, 如果用户选择第二个选项卡在特定条件下,我希望用户重定向到第一个选项卡,并禁止他转到sencond选项卡,直到条件匹配。 为了达到这个目的,我试过了,

tabLayout.getTabAt(0).select(); 

但它没有重新选择第一个标签

7 个答案:

答案 0 :(得分:47)

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

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

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

答案 1 :(得分:1)

这对我有用:

int tabIndex = 2;
tabLayout.setScrollPosition(tabIndex,0f,true);
viewPager.setCurrentItem(tabIndex);

答案 2 :(得分:0)

您可以在 <script> $(function() { $( "#datepicker1" ).datepicker({ dateFormat: 'yy-mm-dd', }); $("#datepicker1").on("change",function(){ date = $(this).val(); alert(date); }); }); $(function() { $( "#datepicker2" ).datepicker({ dateFormat: 'yy-mm-dd', }); $("#datepicker2").on("change",function(){ todate = $(this).val(); alert(todate); }); }); $("#button2").click(function(){ var titel = $("#eTitel").val(); var descritption = $("#eDesc").val(); var date = $('input[name=datepicker1]'); var todate = $('input[name=datepicker2]'); if(titel == " " && descritption == " " && date == " " && todate == " ") { alert("values are missing"); } else{ $.ajax({ type:"POST", url: "olle.php", data:{ titel: titel, descritption: descritption, date: date, todate: todate, }, success: function (msg){ $("#eTitel").val(""); $("#eDesc").val(""); $("#datepicker1").val(""); $("#datepicker2").val(""); }, error: function(){ alert("error didnt insert"); } }); } }); </script>

中选择标签

答案 3 :(得分: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);
    }
不要忘记初始化上面的标签布局。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

如果您进入内部,看看内部如何实现tabLayout.getTabAt(tabIndex).select();。您将了解到,它会将您的流程发送到

onTabReselected(tab: TabLayout.Tab?)

您的流程没有进入

onTabSelected(tab: TabLayout.Tab?)

如果您的当前标签 tabIndex 相同。因此,考虑这一点非常重要。

答案 6 :(得分:-1)

Mihir的回答给了我一个尝试的想法。似乎不需要硬编码计时器就可以工作,并且还可以正确更新所选标签的滚动条:

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