【问题标题】:Android TabLayout select first Tab on StartupAndroid TabLayout 在启动时选择第一个选项卡
【发布时间】:2016-05-06 12:50:04
【问题描述】:

我正在使用来自 Android 设计库的 TabLayout。我有多个选项卡,每个选项卡在被选中时都有一个操作。所以我有一个属性startSelection,它执行

tabLayout.getTabAt(startSelection).select();

这将选择选项卡并为此选项卡执行操作。它适用于除第一个选项卡外的每个选项卡,第一个选项卡在启动时自动选择,无需 (!) 执行操作。有人对此有解决方案吗?

我不想使用 onTabReselected 方法,因为这会导致 TabLayout 的另一种行为。同样选择第二个标签,然后再选择第一个标签也不是好的解决方案。

最好的问候

【问题讨论】:

    标签: android tabs selection


    【解决方案1】:

    使用添加自定义标签也可以实现这一点 TabLayout 的 addTab() 方法有 2 个参数,例如

    //第一个参数选项卡 //第二个参数setSelected

    tabLayout.addTab(tab, true/false)
    

    //示例

    for (item in tabsList) {
                var tab = tabLayout.newTab()
                tab.text = item.name
                if (conditions for selections) {
                    tabLayout.addTab(tab, true)
                } else {
                    tabLayout.addTab(tab, false)
                }
            }
    

    【讨论】:

      【解决方案2】:

      我明白了。解决方案很简单,使用(一次)onTabReselected 并覆盖那里的监听器。

      tabLayout.setOnTabSelectedListener(new OnTabSelectedListener() {
      
          @Override
          public void onTabSelected(Tab tab) {
              selectTab(tab);
          }
      
          private void selectTab(Tab tab) {
              // do something                 
          }
      
          @Override
          public void onTabReselected(Tab tab) {
              if (tab.getPosition() == 0) {
                  selectTab(tab);
      
                  tabLayout.setOnTabSelectedListener(new OnTabSelectedListener() {
      
                      @Override
                      public void onTabSelected(Tab tab) {
                          selectTab(tab);
                      }
      
                      @Override
                      public void onTabReselected(Tab arg0) {                             
                      }
      
                      @Override
                      public void onTabUnselected(Tab arg0) {                             
                      }
                  });
      
              }
          }
      
      
          @Override
          public void onTabUnselected(Tab tab) {
          }
      
      });
      

      【讨论】:

      • setOnTabSelectedListener 已弃用。请改用 addOnTabSelectedListener
      【解决方案3】:

      我在实现的自定义选项卡布局中遇到了类似的问题,当启动活动时,第一个选项卡不会出现在选定状态,但选项卡 2、3、4... 会在启动时自动选择。

      对我有帮助的解决方案是在onResume(),快速选择第二个选项卡然后返回第一个选项卡。

          @Override
          protected void onResume() {
              super.onResume();
              mTabLayout.getTabAt(1).select();
              mTabLayout.getTabAt(0).select();
          } 
      

      【讨论】:

        【解决方案4】:

        当您尝试以语法方式选择第一个选项卡时,您的视图初始化尚未完成。使用句柄并等到100ms 然后尝试选择选项卡。

        在你的onCreate()试试这个

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

        【讨论】:

        • 嗨,当我这样做时,初始化过程就完成了。正如我所写,选择一个选项卡适用于选项卡 2、3、4,依此类推。但不是第一个,因为默认情况下会选择该选项卡。选择选定的选项卡不会执行任何操作。 :(
        • 正如@user2331454 提到的,这不起作用,因为 .select() 将被忽略,因为 startSelection == currentSelected
        【解决方案5】:

        我有更简单的解决方案

        tabLayout.addOnTabSelectedListener(object: TabLayout.OnTabSelectedListener {
          private var alreadyReselected = AtomicBoolean(false)
        
          override fun onTabReselected(tab: TabLayout.Tab) {
            if  (tab.position == 0 && !alreadyReselected.getAndSet(true)) onTabSelected(tab)
          }
          override fun onTabUnselected(tab: TabLayout.Tab?) {}
        
          override fun onTabSelected(tab: TabLayout.Tab) {
            //do whatever you want on first selection
          }
        })
        

        【讨论】: