【问题标题】:android.support.design.widget.TabLayout select Tab Programmaticallyandroid.support.design.widget.TabLayout 以编程方式选择选项卡
【发布时间】:2015-10-31 16:36:56
【问题描述】:

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

tabLayout.getTabAt(0).select(); 

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

【问题讨论】:

  • 与其让他们导航然后不得不重定向他们,在满足条件之前禁用选项卡选择可能更容易:stackoverflow.com/questions/4497187/…
  • @QuintinBalsdon ,谢谢,但是您链接中的示例与 TabHost 相关。它在 tabhost.getTabwidget 中有 setEnable() 方法。我在支持库中使用新的 TabLayout。

标签: android android-tablayout


【解决方案1】:

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

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

onTabReselected(tab: TabLayout.Tab?)

而且你的流程没有转到

onTabSelected(tab: TabLayout.Tab?)

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

【讨论】:

    【解决方案2】:
    tabLayout.getTabAt(index specific).select();
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        这对我有用:

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

        【讨论】:

          【解决方案5】:

          您可以选择Fragment.onViewCreated()中的标签。

          【讨论】:

            【解决方案6】:

            我就是这样解决的:

            tabLayout.getTabAt(CurrentItem).getCustomView().setSelected(true);
            

            【讨论】:

              【解决方案7】:

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

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

              别忘了在上面初始化你的标签布局。

              【讨论】:

                【解决方案8】:

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

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

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

                【讨论】:

                • 是否有可能监听事件(即 onCreationComplete).. 以便实现基于事件的解决方案,而不是使用硬编码计时器?
                • 我想没有这样的方法。
                • 我想我在没有硬编码计时器的情况下解决了这个问题,请参阅my answer
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2011-09-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多