Android TabLayout启动时选择第一个选项卡

xmd2e60i  于 2023-01-28  发布在  Android
关注(0)|答案(6)|浏览(369)

我使用的是Android Design Library中的TabLayout。我有多个选项卡,每个选项卡在被选中时都有一个操作。因此,我有一个属性startSelection,它执行

tabLayout.getTabAt(startSelection).select();

这将选择选项卡并执行此选项卡的操作。除了第一个选项卡外,它对每个选项卡都很好用,第一个选项卡在启动时自动选择,而不需要(!)执行操作。有人对此有解决方案吗?
我不想使用onTabReselected方法,因为这会导致TabLayout的另一种行为。同样,选择第二个选项卡,然后选择第一个选项卡也不是好的解决方案。
最好的问候

3xiyfsfu

3xiyfsfu1#

我在实现一个自定义选项卡布局时遇到了类似的问题,启动Activity时,第一个选项卡不会显示为选中状态,但选项卡2,3,4 ...会在启动时自动选中。
帮助我的解决方案是在onResume()中,快速选择第二个选项卡,然后返回到第一个选项卡。

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

ngynwnxp2#

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

});
gv8xihay

gv8xihay3#

使用添加自定义选项卡也可以实现此TabLayout的addTab()方法,带有2个参数,例如
//第一个参数选项卡//第二个参数集选定

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

v8wbuo2f4#

我有更简单解决办法

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

4sup72z85#

你只需要把逻辑颠倒过来
先设置onTabSelected,片段知道选择了哪个选项卡后,设置:
制表符布局.添加制表符(制表符布局.新制表符().设置文本(“持续时间”),真)
如果添加的选项卡应成为选定选项卡,则第二个参数为true

xtupzzrd

xtupzzrd6#

当你试图按语法选择第一个选项卡时,你的视图初始化还没有完成。使用句柄并等待100ms,然后尝试选择选项卡。
在您的onCreate()中尝试此操作

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

相关问题