Widget.AppCompat.Button.Colored 禁用时按钮透明

Widget.AppCompat.Button.Colored Button transparent when disabled

我正在努力对抗 Widget.AppCompat.Button.Colored 风格的默认行为。默认情况下,按钮是半透明的。我希望它是不透明的。 这是我的代码:

布局中的按钮:

<Button
    android:id="@+id/search"
    style="@style/Widget.AppCompat.Button.Colored"
    android:theme="@style/AccentButton"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Search"/>

styles.xml

<style name="AccentButton" parent="ThemeOverlay.AppCompat.Light">
    <item name="colorAccent">@color/colorAccent</item>
    <item name="colorButtonNormal">#f00</item>
</style>

如果我删除 style="@style/Widget.AppCompat.Button.Colored" 部分,禁用后按钮将不会变为透明。

我试图查看 Appcompat/Android 源代码。虽然没有运气。我找不到设置为透明的部分。目标是使用大部分 AppCompat 代码获得一个很好的解决方案。我知道我可以创建自定义可绘制按钮背景。我想避免它。有什么想法吗?

解决方案是使用:<item name="android:disabledAlpha">1.0</item> 像这样:

<style name="AccentButton" parent="ThemeOverlay.AppCompat.Light">
    <item name="colorAccent">@color/colorAccent</item>
    <item name="colorButtonNormal">#f00</item>
    <item name="android:disabledAlpha">1.0</item>
</style>

我是如何得到这个答案的

经过一番努力,我找到了 btn_colored_material.xml 源代码。

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="false"
          android:alpha="?attr/disabledAlpha"
          android:color="?attr/colorButtonNormal" />
    <item android:color="?attr/colorAccent" />
</selector>

它使用 disabledAlpha 属性。所以这只是使用它的问题。

有一件事我仍然不明白,为什么我必须将它与 android: 前缀一起使用。我希望:

  • ?android:attr/something 设置为 <item name='android:something'>(...)
  • ?attr:something 设置为 <item name='something'>(...)

我的猜测是,如果 Android 源代码代码使用它自己的属性,则不需要前缀。