根据状态w / compat libs更改FAB的图标颜色

时间:2017-02-03 21:11:45

标签: android material-design android-styles floating-action-button

我正在尝试根据按钮状态更改FAB中图标的图标颜色:

<android.support.design.widget.FloatingActionButton
    android:id="@+id/search_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|end"
    android:layout_margin="16dp"
    android:tint="@color/add_button_tint"
    android:src="@drawable/ic_add_black_24dp" />

add_button_tint.xml:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true"
        android:color="@color/white" />

    <item android:color="@color/black"/>
</selector>

这适用于API&gt;但是在旧版本的android中,它会引发异常。

这是我感到困惑的地方:

android:tint属性存在于支持FAB中,如果它只是一种颜色,即使在旧版本的android中也能正常工作。 IE这适用于我测试的所有版本:

android:tint="@color/black

但是当我使用选择器时却没有。我究竟做错了什么?是否可以根据旧版Android中FAB的状态更改图标颜色?

1 个答案:

答案 0 :(得分:8)

  在API 21之前,不支持android:tint中的ColorStateList。

请参阅:https://code.google.com/p/android/issues/detail?id=204671

您可以使用AppCompat的AppCompatResources和support-v4 DrawableCompat来支持pre-lollipop。首先,从布局中删除android:tint="@color/add_button_tint"。然后以编程方式设置ColorStateList

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.search_button);
ColorStateList csl = AppCompatResources.getColorStateList(this, R.color.add_button_tint);
Drawable drawable = DrawableCompat.wrap(fab.getDrawable());
DrawableCompat.setTintList(drawable, csl);
fab.setImageDrawable(drawable);

请参阅How to use setImageTintList() on Android API < 21