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

9

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

tabLayout.getTabAt(startSelection).select();

这个操作会选择一个选项卡并执行其相应的动作。对于每个选项卡都能正常工作,除了在启动时自动选择第一个选项卡(即无需手动选择),却没有执行相应的动作。是否有人有解决方案?

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

最好的祝愿

6个回答

6

我曾经遇到一个类似的问题,当我实现自定义标签布局时,启动活动后第一个标签不会出现在选中状态,但是第二个、第三个、第四个标签等在启动时自动选择后会出现在选中状态。

对我有用的解决方案是在onResume()中,快速选择第二个标签,然后返回第一个标签。

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

5

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

});

1
setOnTabSelectedListener已被弃用,请使用addOnTabSelectedListener代替。 - Anbuselvan Rocky

3
通过添加自定义选项卡,也可以实现这一点。使用TabLayout的addTab()方法,并提供两个参数,例如:

//第一个参数是选项卡 //第二个参数是设置选项卡是否被选中

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

0

你只需要像这样反转逻辑

首先设置 onTabSelected,然后在 fragment 知道哪个选项卡被选中后进行设置:

tabLayout.addTab(tabLayout.newTab().setText("Duration"), true)

如果添加的选项卡应成为选定选项卡,则将第二个参数设置为 true


0

我有更简单的解决方案

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

-2

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

在您的onCreate()中尝试此操作。

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

2
嗨,当我这样做时,初始化过程已经完成。正如我所写的,选择选项卡对于选项卡2、3、4等有效。但是对于第一个选项卡不起作用,因为该选项卡是默认选中的。选择已选中的选项卡不会执行任何操作。 :( - user2331454
正如@user2331454所提到的,这不起作用,因为.select()将被忽略,因为startSelection == currentSelected。 - Bugdr0id

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接