选定的TabLayout图标在启动时未被选中

11

我在我的应用程序中使用TabLayout进行选项卡导航。我遇到了一个非常奇怪的问题,我使用以下代码创建了4个选项卡:

private int[] tabIcons = {R.drawable.navigation_timeline_icon_selector, R.drawable.navigation_feed_icon_selector,
        R.drawable.navigation_messages_icon_selector, R.drawable.navigation_notification_icon_selector};

 TabLayout tabLayout = setTabLayout();
    if (tabLayout != null) {
        for (int i = 0; i < 4; i++) {
            tabLayout.getTabAt(i).setIcon(tabIcons[i]);
        }
    }

tabIcon中的每个项目都是具有选定和非选定状态的选择器。 所有图标选择器的配置如下:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
      <item android:drawable="@drawable/navigation_timeline_selected_icon" android:state_selected="true"/>
      <item android:drawable="@drawable/navigation_timeline_selected_icon" android:state_pressed="true"/>
      <item android:drawable="@drawable/navigation_timeline_icon" />
</selector>
问题在于当应用程序启动时,第一个选定的选项卡(索引0)不使用选定状态图标。它使用未选定状态的图标。
为了更加说明这个问题,这里附上一张屏幕截图:在第一次启动时,我的选项卡看起来是这样的: enter image description here 而事实上它应该像这样: enter image description here 在我改变页面后,所有的图标都恢复到完全的功能状态,选定状态也被正确地选中了。
我尝试使用TabLayout.Tab select()方法,但结果是相同的,使用的图标是未选定的图标。
有人知道我该怎么办来解决吗?

@MsYvette 这是什么意思,如何处理? - Emil Adz
@MsYvette 你想看选择器吗? - Emil Adz
@MsYvette 嗯,选择器的更改没有解决问题,出于某种原因它仍然没有被选中。继续寻找解决方案。 - Emil Adz
@MsYvette 选择器代码已添加。 - Emil Adz
嗨@EmilAdz,我们已经有解决这个问题的方案了吗? - Elye
显示剩余2条评论
6个回答

11
试试这个: tabLayout.getTabAt(你的初始位置).getCustomView().setSelected(true);
它可以选择你指定的选项卡。

我没有“getCustomView()”方法,因为我没有将我的选项卡添加为自定义视图,而是作为简单的普通图标。因此,即使这个方法有效,我也不能使用这个解决方案。 - Emil Adz
getCustomView是TabLayout.Tab类的公共方法,因此您必须拥有它,在这种情况下,它将返回您应用于此选项卡的可绘制选择器。我不明白为什么如果它有效,您就不能使用它。也许我漏掉了什么..您能详细说明一下吗? - emirua
如果您无法使用此解决方案,您始终可以通过编程将选择更改为不同的选项卡,然后切换回初始位置。 - emirua
1
你是对的,getCustomView确实是一个公共方法,但除非你将选项卡设置为自定义视图而不是图标选项卡,否则无法使用该方法。 - Emil Adz
@Emil,你可以尝试使用tabLayout.getTabAt(0).select();但是如果你有自定义视图,它可能不起作用。 - sivi
显示剩余2条评论

4
TabLayout 中选项卡选择的正确答案应该是:
TabLayout.Tab currentTab = mTabs.getTabAt(selectedTab);
if (currentTab != null) {
    View customView = currentTab.getCustomView();
    if (customView != null) {
        customView.setSelected(true);
    }
    currentTab.select();
}

currentTab.select()会将指示器移动到所选选项卡,而customView.setSelected()会使自定义视图中的所有项目从选择器中设置其选定状态。


3
我在TabLayout中使用了XML选择器来定义图标的状态,包括以下内容:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="false" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/icon_ajuda_off"/>
<item android:state_focused="false" android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/icon_ajuda_on"/>
<item android:state_selected="false" android:state_pressed="true" android:drawable="@drawable/icon_ajuda_on"/>
<item android:state_selected="true" android:state_pressed="true" android:drawable="@drawable/icon_ajuda_on"/>

在代码中:
private int[] tabIcons = {R.drawable.ic_tab_sites, R.drawable.ic_tab_help,
        R.drawable.ic_tab_profile, R.drawable.ic_tab_notification, R.drawable.ic_tab_search};

if (tabLayout != null) {
    for (int i = 0; i < 5; i++) {
        tabLayout.getTabAt(i).setIcon(tabIcons[i]);
    }
}

这可能会有所帮助。


0

这里是解决方案, 将这段代码粘贴到您的onCreate活动中,因为使用标签0索引不会直接触发,这是一种简单的方法。

 viewPager.setCurrentItem(1);
    if (viewPager.getCurrentItem()==1)
    {
        viewPager.setCurrentItem(0);
    }

0

在填充完选项卡后,请尝试选择它们。

TabLayout tabLayout = setTabLayout();
if (tabLayout != null) {
    for (int i = 0; i < 4; i++) {
        tabLayout.getTabAt(i).setIcon(tabIcons[i]);
    }
    tabLayout.getTabAt(0).select();
}

就像我说的那样:我尝试使用TabLayout.Tab select()方法,但结果是一样的,使用的图标仍然是未选中的图标。 - Emil Adz
是的,我现在看到了...实际上我认为第一个选项卡也是默认选中的。问题不在于选项卡没有被选中,而在于使用了错误的图标。 - Emil Adz
这个问题是什么意思?每次选择另一个选项卡时会发生什么?在启动时应选择索引为0的选项卡。 - Emil Adz

0
在我的情况下,我只想将矢量图形添加到选择器文件中,但它不起作用,所以如果你想使用矢量图形,你必须将它们作为单独的文件添加...

<item android:drawable="@drawable/stnkb_tab_recent_selected_true" android:state_selected="true" />
<item android:drawable="@drawable/stnkb_tab_recent_selected_false" />


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