Android TabLayout select 启动时的第一个选项卡

Android TabLayout select first Tab on Startup

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

tabLayout.getTabAt(startSelection).select();

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

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

此致

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

在您的 onCreate()

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

我明白了。解决方案很简单,使用(一次)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) {
    }

});

我有更简单的解决方案

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

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

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

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

使用添加自定义标签也可以实现 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)
            }
        }