如何更改TabLayout所选选项卡图标的颜色?

way*_*way 66 java mobile android material-design android-tablayout

我正在使用a TabLayout,ViewPager我想知道如何最有效地更改TabLayout中所选标签图标的颜色.

谷歌的Youtube应用程序是如何实现这一功能的完美参考.在主页面上,有四个图标为深灰色.选择特定选项卡后,选项卡的图标将变为白色.

没有任何第三方库,我怎样才能达到同样的效果?

一种可能的解决方案显然是选择器.但在这种情况下,我必须找到图标的白色和灰色版本,然后在选中或取消选择选项卡时切换图标.我想知道是否有更有效的方法我可以突出显示图标颜色或其他东西.我在任何教程中都找不到这个.

编辑

我上面直接提到的解决方案需要为每个标签的图标使用两个drawable.我想知道是否有一种方法可以通过一个 drawable为每个标签的图标以编程方式进行.

Cri*_*yos 81

我找到了一种方便的方法.

    viewPager = (ViewPager) findViewById(R.id.viewpager);
    setupViewPager(viewPager);

    tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);
    tabLayout.setOnTabSelectedListener(
            new TabLayout.ViewPagerOnTabSelectedListener(viewPager) {

                @Override
                public void onTabSelected(TabLayout.Tab tab) {
                    super.onTabSelected(tab);
                    int tabIconColor = ContextCompat.getColor(context, R.color.tabSelectedIconColor);
                    tab.getIcon().setColorFilter(tabIconColor, PorterDuff.Mode.SRC_IN);
                }

                @Override
                public void onTabUnselected(TabLayout.Tab tab) {
                    super.onTabUnselected(tab);
                    int tabIconColor = ContextCompat.getColor(context, R.color.tabUnselectedIconColor);
                    tab.getIcon().setColorFilter(tabIconColor, PorterDuff.Mode.SRC_IN);
                }

                @Override
                public void onTabReselected(TabLayout.Tab tab) {
                    super.onTabReselected(tab);
                }
            }
    );
Run Code Online (Sandbox Code Playgroud)

  • 不建议使用setOnTabSelectedListener,请使用addOnTabSelectedListener (2认同)

小智 40

private void setupTabIcons() {
    tabLayout.getTabAt(0).setIcon(tabIcons[0]);
    tabLayout.getTabAt(1).setIcon(tabIcons[1]);
    tabLayout.getTabAt(2).setIcon(tabIcons[2]);
    tabLayout.getTabAt(3).setIcon(tabIcons[3]);

    tabLayout.getTabAt(0).getIcon().setColorFilter(Color.GREEN, PorterDuff.Mode.SRC_IN);
    tabLayout.getTabAt(1).getIcon().setColorFilter(Color.parseColor("#a8a8a8"), PorterDuff.Mode.SRC_IN);
    tabLayout.getTabAt(2).getIcon().setColorFilter(Color.parseColor("#a8a8a8"), PorterDuff.Mode.SRC_IN);
    tabLayout.getTabAt(3).getIcon().setColorFilter(Color.parseColor("#a8a8a8"), PorterDuff.Mode.SRC_IN);


    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            tab.getIcon().setColorFilter(Color.GREEN, PorterDuff.Mode.SRC_IN);

        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
            tab.getIcon().setColorFilter(Color.parseColor("#a8a8a8"), PorterDuff.Mode.SRC_IN);
        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });
}
Run Code Online (Sandbox Code Playgroud)

  • setOnTabSelectedListener 已弃用。改用 addOnTabSelectedListener 。https://developer.android.com/reference/android/support/design/widget/TabLayout.html#addOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener) (2认同)

Fel*_*ann 34

您可以使用ColorStateList.

首先,创建一个/color/tab_icon.xml看起来像这样的xml文件,并定义不同状态的不同色调:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/icon_light"
        android:state_selected="true" />

    <item android:color="@color/icon_light_inactive" />
</selector>
Run Code Online (Sandbox Code Playgroud)

然后将其添加到您的代码中:

ColorStateList colors;
if (Build.VERSION.SDK_INT >= 23) {
    colors = getResources().getColorStateList(R.color.tab_icon, getTheme());
}
else {
    colors = getResources().getColorStateList(R.color.tab_icon);
}

for (int i = 0; i < tabLayout.getTabCount(); i++) {
    TabLayout.Tab tab = tabLayout.getTabAt(i);
    Drawable icon = tab.getIcon();

     if (icon != null) {
        icon = DrawableCompat.wrap(icon);
        DrawableCompat.setTintList(icon, colors);
    }
}
Run Code Online (Sandbox Code Playgroud)

首先,从XML中获取ColorStateList(不使用主题的方法,但对于Marshmallow之前的设备是必需的).然后为每个选项卡的图标设置它的TintList到ColorStateList; 使用DrawableCompat(支持库)也支持旧版本.

而已!

  • 这是迄今为止最好的解决方案,因为它并不意味着手动更改图标颜色 (4认同)

Vin*_*man 27

这可以非常简单地完全在xml中完成。

在xml中的T​​abLayout中添加一行app:tabIconTint="@color/your_color_selector",如下所示:

 <android.support.design.widget.TabLayout
     android:id="@+id/tab_layout"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     app:tabIconTint="@color/your_color_selector"
     app:tabIndicatorColor="@color/selected_color"/>
Run Code Online (Sandbox Code Playgroud)

然后,在res / color目录中创建一个颜色选择器文件(上面名为“ your_color_selector.xml”):

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/selected_color" android:state_selected="true"/>
    <item android:color="@color/unselected_color"/>
</selector>
Run Code Online (Sandbox Code Playgroud)

假设您在colors.xml文件中有两种颜色,即“ selected_color”和“ unselected_color”。


Ans*_*agi 13

对于它你必须为每个Tab使用选择器类自定义选项卡图标,如:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/advisory_selected" android:state_selected="true" />
<item android:drawable="@drawable/advisory_normal" android:state_selected="false" />
Run Code Online (Sandbox Code Playgroud)


小智 12

res > colors目录下添加这个:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_selected="true" android:color="@android:color/holo_orange_dark"/>
  <item android:color="@android:color/holo_red_light"/>
</selector>
Run Code Online (Sandbox Code Playgroud)

在 xml 中的选项卡视图中添加代码:

app:tabIconTint="@color/selector_tab"
Run Code Online (Sandbox Code Playgroud)

  • if (Build.VERSION.SDK_INT &gt;= 23) { 它有效 } else { /sf/answers/2531287671/ } (2认同)

Pra*_*ath 5

检查以下代码。自定义您的图标,一种是颜色,另一种是无颜色。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/mybookings_select" android:state_selected="true"/><!-- tab is selected(colored icon)-->
<item android:drawable="@drawable/mybookings" /><!-- tab is not selected(normal no color icon)-->
Run Code Online (Sandbox Code Playgroud)


par*_*301 5

你为什么不为你的图标使用图标字体(比如字体真棒)?然后将标签文本的字体更改为您想要的字体图标 .ttf 并享受将所选文本颜色更改为您的标签图标的乐趣!

我,我自己,使用了这种方法,它真的很好很干净:)

首先,从您想要的图标字体设置标题:

在 string.xml 中:

    <string name="ic_calculator">&#xf1ec;</string>
    <string name="ic_bank">&#xf19c;</string>
Run Code Online (Sandbox Code Playgroud)

然后在 MainActivity.Java 中:

    private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new FragmentBank(), getString(R.string.ic_bank));
    adapter.addFragment(new FragmentCalculate(), getString(R.string.ic_calculator));
    viewPager.setAdapter(adapter);
    }
Run Code Online (Sandbox Code Playgroud)

然后你应该将 Tab 标题的字体更改为 font-awesome:

    Typeface typeFaceFont = Typeface.createFromAsset(getAssets(), "fontawesome-webfont.ttf");

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);
    ViewGroup vg = (ViewGroup) tabLayout.getChildAt(0);
    int tabsCount = vg.getChildCount();
    for (int j = 0; j < tabsCount; j++) {
        ViewGroup vgTab = (ViewGroup) vg.getChildAt(j);
        int tabChildsCount = vgTab.getChildCount();
        for (int i = 0; i < tabChildsCount; i++) {
            View tabViewChild = vgTab.getChildAt(i);
            if (tabViewChild instanceof TextView) {
                ((TextView) tabViewChild).setTypeface(typeFaceFont);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

最后但并非最不重要的是,在相关的 .xml 文件中,为 tabTextColor 和 tabSelectedTextColor 设置颜色:

<android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scrollbars="horizontal"
        android:background="@color/colorPrimaryDark"
        app:tabSelectedTextColor="@color/colorAccent"
        app:tabTextColor="@color/textColorPrimary"
        app:tabIndicatorColor="@color/colorAccent"
        app:tabMode="fixed"
        app:tabGravity="fill"/>
</android.support.design.widget.TabLayout>
Run Code Online (Sandbox Code Playgroud)

并在colors.xml中:

<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>
    <color name="colorHighlight">#FFFFFF</color>
    <color name="textColorPrimary">#E1E3F3</color>
</resources>
Run Code Online (Sandbox Code Playgroud)


小智 2

“突出显示”图标的一种可能方法是访问图像视图并设置滤色器。尝试使用 setColorFilter(int color) ImageView 方法并应用白色。