返回

Android Material Design 中为按钮着色——AppCompat 带来的挑战

Android

Android Material Design 中使用 AppCompat 为按钮着色

问题背景

在 AppCompat 更新之前,我们可以通过修改 styles.xml 或动态地应用 PorterDuff.Mode.MULTIPLY 过滤器来更改按钮颜色。但是,在包含新的 AppCompat 更新后,按钮在尝试更改颜色时会消失。

解决方法

要解决这个问题,我们需要采取以下步骤:

  1. 检查 AppCompat 版本: 确保使用最新版本的 AppCompat 库。旧版本可能会出现此问题。

  2. 使用 ColorStateList: 使用 ColorStateList 而不是直接设置颜色。ColorStateList 会根据按钮的状态(例如启用、禁用)动态调整颜色。

  3. 创建自定义主题:values-v21 文件夹下创建一个自定义主题文件(例如 themes.xml),并在其中定义 colorButtonNormalColorStateList

例如:

<resources>
    <style name="MyTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorButtonNormal">@color/my_button_color</item>
    </style>
</resources>
  1. 设置自定义主题:AndroidManifest.xml 文件中,将应用程序的主题设置为自定义主题。
<application
    android:theme="@style/MyTheme"
    ...>
</application>
  1. 创建 my_button_color.xml 文件:res/color 文件夹下创建此文件,并定义按钮颜色状态。
<resources>
    <color name="my_button_color">#FF0000</color>
    <color name="my_button_color_disabled">#80FF0000</color>
</resources>
  1. 在代码中设置主题: 如果您在代码中动态设置主题,请确保使用 setTheme(int) 方法来设置 R.style.MyTheme

结论

通过使用 ColorStateList 和自定义主题,我们可以为按钮设置颜色,而不会遇到 AppCompat 更新后的按钮消失问题。

常见问题解答

1. 为什么我仍然无法更改按钮颜色?

  • 确保您使用的是最新版本的 AppCompat 库。
  • 检查 styles.xml 文件中是否存在与 colorButtonNormal 相冲突的设置。

2. 如何创建其他自定义颜色主题?

  • 为每种颜色创建单独的 ColorStateList,并将其定义在自定义主题文件中。
  • AndroidManifest.xml 中将应用程序的主题设置为所需的自定义主题。

3. 如何在代码中动态更改按钮颜色?

  • 为按钮创建自定义 ColorStateList
  • 使用 setBackgroundTintList(ColorStateList) 方法设置按钮的背景色。

4. 如何为不同的按钮设置不同的颜色?

  • 为每个按钮创建单独的 ColorStateList
  • 使用 setId() 方法为按钮设置唯一的 ID。
  • 使用 findViewById(int) 找到按钮并设置其背景色。

5. 如何使用矢量可绘制对象来着色按钮?

  • 创建一个具有所需颜色的矢量可绘制对象。
  • 使用 setCompoundDrawablesWithIntrinsicBounds() 方法将矢量可绘制对象设置到按钮上。
  • 使用 setColorFilter() 方法为矢量可绘制对象着色。