Button 的背景颜色是由 colorPrimary 而非 colorAccent 着色的吗?

Is Button's background colored by colorPrimary, not colorAccent?

我的设置:minSdkVersion 19 && compileSdkVersion 30

我试过下面的代码。我希望按钮的背景颜色为 colorAccent,但实际颜色为 colorPrimary。当我将 colorPrimary 值更改为另一种颜色时,按钮的背景颜色会相应改变。

这与我学到的相反。 (当样式为“@style/Widget.AppCompat.Button.Colored”时,按钮的背景颜色应为 colorAccent)。我在遵循 Google Android 基础教程 (https://developer.android.com/codelabs/kotlin-android-training-interactivity/index.html#4) 时遇到了这个问题。

我很困惑,请帮忙。

// activity_main.xml
<Button
    style="@style/Widget.AppCompat.Button.Colored"
    android:id="@+id/done_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/done" />

// themes.xml
<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.AboutMe" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
        <!-- Primary brand color. -->
        <item name="colorPrimary">@color/purple_500</item>
        <item name="colorPrimaryVariant">@color/purple_700</item>
        <item name="colorOnPrimary">@color/white</item>
        <!-- Secondary brand color. -->
        <item name="colorSecondary">@color/teal_200</item>
        <item name="colorSecondaryVariant">@color/teal_700</item>
        <item name="colorOnSecondary">@color/black</item>
        <!-- Status bar color. -->
        <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
        <!-- Customize your theme here. -->
        <item name="colorAccent">@color/colorAccent</item>
    </style>
</resources>

// colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="purple_200">#FFBB86FC</color>
    <color name="purple_500">#FF6200EE</color>
    <color name="purple_700">#FF3700B3</color>
    <color name="teal_200">#FF03DAC5</color>
    <color name="teal_700">#FF018786</color>
    <color name="black">#FF000000</color>
    <color name="white">#FFFFFFFF</color>
    <color name="colorAccent">#880000</color>
</resources>

我注意到按钮颜色也设置为默认主色而不是强调色,但是 您可以通过设置按钮的 android:backgroundTint 属性而不是 style-

来修复它
<Button
            android:id="@+id/btn"
            android:gravity="center"
            android:text="Button"
            android:backgroundTint="@color/colorAccent"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

由于您使用的是 Material 组件主题,因此您的 Button 在运行时被 MaterialButton 替换。

MaterialButton 使用 ?attr/colorPrimary 作为背景色。 样式 Widget.AppCompat.Button.Colored 应用背景可绘制对象,它被 MaterialButton 提供的 MaterialShapeDrawable 覆盖。

Button 中使用 Material 组件样式作为 Widget.MaterialComponents.Buttonapp:backgroundTint 在背景中应用不同的颜色:

   <Button
    style="@style/Widget.MaterialComponents.Button"
    app:backgroundTint="@color/....."
    ../>

或:

  <Button
    style="@style/Widget.MaterialComponents.Button"
    android:theme="@style/ButtonThemeOverlayPrimaryColor"
    ../>


  <style name="ButtonThemeOverlayPrimaryColor">
    <item name="colorPrimary">@color/....</item>
  </style>
  

或者如果您想使用 AppCompat 样式,请使用 AppCompatButton.

<androidx.appcompat.widget.AppCompatButton
    style="@style/Widget.AppCompat.Button.Colored"/>