Android TabLayout在启动时选择第一个标签

9 人关注

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

tabLayout.getTabAt(startSelection).select();

这就选择了标签,并对这个标签执行了操作。除了第一个标签,它对每个标签都工作得很好,因为它在启动时被自动选择,而没有(!)执行操作。有谁能解决这个问题吗?

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

最好的问候

android
tabs
selection
user2331454
user2331454
发布于 2016-05-06
5 个回答
Cameron A
Cameron A
发布于 2016-05-06
已采纳
0 人赞同

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

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

    @Override
    protected void onResume() {
        super.onResume();
        mTabLayout.getTabAt(1).select();
        mTabLayout.getTabAt(0).select();
    
user2331454
user2331454
发布于 2016-05-06
0 人赞同

我明白了。解决办法很简单,使用(一次)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 而不是。
Mansukh Ahir
Mansukh Ahir
发布于 2016-05-06
0 人赞同

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

//第一个args标签 //第二个参数 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)
    
gbixahue
gbixahue
发布于 2016-05-06
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
    
Amy
Amy
发布于 2016-05-06
0 人赞同

当你试图从语法上选择第一个标签时,你的视图初始化还没有完成。使用句柄并等待到 100ms ,然后尝试选择标签。

Try this in your onCreate()

new Handler().postDelayed(
    new Runnable(){
        @Override