我目前正在尝试使用当前纯白色的 Drawables 在一些 ImageButtons 上实现着色。 Tint Color 应该由 StateList 提供,并且应该根据按钮的当前状态而改变。状态列表看起来像:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#FF0000"/>
<item android:color="#00FF00" android:state_enabled="false"/>
<item android:color="#0000FF" android:state_pressed="true" android:state_enabled="true"/>
</selector>
按钮的布局 XML fragment 是:
<ImageButton
android:id="@+id/btnNext"
style="@style/Widget.AppCompat.Button.Borderless"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/vertical_content_padding"
android:layout_marginEnd="@dimen/horizontal_content_padding"
android:contentDescription="@string/next"
android:src="@drawable/ic_chevron_right_white_24dp"
android:tint="@color/state_btn_tint_light"/>
颜色状态列表中的默认色调已被选中并正确显示。但是禁用按钮或按下它不会触发所有图标的任何颜色变化。我也尝试用 setImageTintList 实用地设置它.
最佳答案
您的代码应该可以工作。但是,有一个错误:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#FF0000"/>
<item android:color="#00FF00" android:state_enabled="false"/>
<item android:color="#0000FF" android:state_pressed="true" android:state_enabled="true"/>
</selector>
您需要颠倒状态的顺序。
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#0000FF" android:state_pressed="true" android:state_enabled="true"/>
<item android:color="#00FF00" android:state_enabled="false"/>
<item android:color="#FF0000"/>
</selector>
我不完全确定它在内部是如何工作的,但它的功能似乎类似于 If/Else 语句。如果第一个条件失败,则进入第二个。由于您的第一个项目没有条件,它总是会被挑选而其他的将被忽略,给人的印象是颜色状态列表根本不起作用。因此,始终将条件最严格的颜色状态放在第一位。
关于android - 基于状态的 ImageButton 图标色调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48505834/