los*_*ion 7 android android-styles material-design 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" />
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
这在API> 23中效果很好,但是在旧版本的android中,它会引发异常.
这是我感到困惑的地方:
android:tint属性存在于支持FAB中,如果它只是一种颜色,即使在旧版本的android中也可以工作.IE这适用于我测试的所有版本:
android:tint="@color/black
Run Code Online (Sandbox Code Playgroud)
但是当我使用选择器时却没有.我究竟做错了什么?在旧版Android中,是否可以根据FAB的状态更改图标颜色?
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);
Run Code Online (Sandbox Code Playgroud)
请参阅如何在Android API <21上使用setImageTintList()