如果初始选项卡选择为索引 0,为什么不触发 myTabSelectedListener?

why myTabSelectedListener not triggered if the initial tab selection is index 0?

所以我希望我的选项卡根据特定条件以编程方式切换,所以我的 onResume 上有这段代码

override fun onResume() {
        super.onResume()

        // programatically set tab position based on certain condition
        if (someConditionHere == 0) {
          tabLayout.getTabAt(0)?.select()
        } else if (someConditionHere == 1) {
          tabLayout.getTabAt(1)?.select()
        }



    }

然后当用户 select 我的选项卡布局上的选项卡像这样

时,我有监听器来处理
tabLayout.addOnTabSelectedListener(object: TabLayout.OnTabSelectedListener {

        override fun onTabSelected(tab: TabLayout.Tab?) {


            if  (tab?.position == 0) {
                performActionA()
            } else if (tab?.position == 1) {
                performActionB()
            }



        }

        override fun onTabReselected(tab: TabLayout.Tab?) {

        }

        override fun onTabUnselected(tab: TabLayout.Tab?) {

        }


    })

}

当第一次触发onResume时someConditionHere == 1,然后会调用onTabSelected触发performActionB()

但不幸的是,当someConditionHere == 0开始时,onTabSelected不会被调用,所以performActionA()不会在第一时间被触发。我怀疑选项卡布局默认位于索引 0 上,因此当条件也在索引选项卡 0 中时,将不会触发 addOnTabListener

如何解决这个问题?我希望我的 performActionA()someConditionHere == 0 时从一开始就被调用。如果在 onResume() 中硬编码 performActionA() 不幸的是它将被调用两次

java/kotlin还可以

TabLayout.OnTabSelectedListener里面有一个方法叫做onTabReselected,正如我评论中提到的,它的作用是针对一个已经被选中并且被再次选中的选项卡。

因此,您可能希望将其内容替换为 onTabSelected 的内容。

所以,如果您创建一个函数会更好,这样您就不必重复代码。

fun performNecessaryAction(tab: TabLayout.Tab?) {
    if  (tab?.position == 0) {
        performActionA()
    } else if (tab?.position == 1) {
        performActionB()
    }
}

监听器将如下所示...

tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
    override fun onTabReselected(tab: TabLayout.Tab?) {
        performNecessaryAction(tab)
    }

    override fun onTabSelected(tab: TabLayout.Tab?) {
        performNecessaryAction(tab)
    }

    override fun onTabUnselected(tab: TabLayout.Tab?) {

    }
})