如何使用选择器通过新的 TabLayout 更改图标

How to use selectors to change icons with the new TabLayout

我正在使用 Android 的新支持 TabLayout。问题是我想在选择选项卡时使用选择器更改图标。

我一直在研究源代码,在我看来它永远不会改变视图的状态(因此我不能使用选择器)。

有人知道一些解决方法吗?

谢谢!

可以使用 setCustomView(View view) 方法将 customView 设置为选项卡。因此,您可以创建一个文本视图并为其设置一个选择器,并将该视图设置为选项卡。

希望对您有所帮助!

如果你做的一切都正确(我相信这一点)那么你和我到达了同一点。也许这是新 android appcompat 库中的一个小错误。

我找到了解决此问题的解决方法(在良好的葡萄牙语中称为 Gambiarra)。您需要像这样从 Tab class 调用方法 select():

mTabLayout.getTabAt(x).select();

但这很重要:x 变量必须不同于当前 selected 选项卡索引。

假设您的 my_selector.xml 是,

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/icon_on" android:state_selected="true"/>
    <item android:drawable="@drawable/icon_off"/> <!-- default -->
</selector>

然后就可以直接调用setIcon了,

tab.setIcon(R.drawable.my_selector);

已通过 'com.android.support:design:22.2.0' 验证。

我发现当我第一次为 TabLayout 中的每个选项卡设置自定义视图时,我需要将第一个(索引 0)设置为选中。

    TabLayout toolbarTabLayout = (TabLayout) findViewById(R.id.tabs);
    toolbarTabLayout.setupWithViewPager(mViewPager);
    toolbarTabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
    toolbarTabLayout.setTabMode(TabLayout.MODE_FIXED);
    toolbarTabLayout.setTabTextColors(R.color.colorPrimary, R.color.white);
    // Iterate over all tabs and set the custom view
    for (int i = 0; i < toolbarTabLayout.getTabCount(); i++) {
        TabLayout.Tab tab = toolbarTabLayout.getTabAt(i);
        View v=mSectionsPagerAdapter.getTabView(i);
        // no tabs are actually selected at start, this will make sure the
        // selector for the colors comes in right when initialized
        if (i==0)
            v.setSelected(true);
        tab.setCustomView(v);
    }

这似乎强制在应用自定义视图时选择第一个选项卡。这真的感觉像是一个 hack,希望其他人能找出真正的问题并提出更好的解决方案。

这对我有用:

假设您在可绘制的 res 文件夹中设置了选择器(如上所示 Xingang Huang)。 在您的 MainActivity(您设置 TabLayout 的地方)中,您包含图标选择器数组,然后像这样循环遍历它:

for (int i = 0; i < yourTabLayout.getTabCount(); i++) {
        ImageView imageView = new ImageView(this); //your context, in this case MainActivity.class
        imageView.setImageResource(arr_tabIcons[i]); //tabIcons is the array of icons
        if (i==0) {
            imageView.setSelected(true); 
        }
        yourTabLayout.getTabAt(i).setCustomView(imageView);

    }

tab.setIcon(R.drawable.icon)

效果也很好,但在我的例子中,图标看起来非常小,所以我不得不使用带有 ImageView 的解决方案来填充选项卡视图。

编码愉快 ;)