Android主题覆盖所有颜色[重复]

Posted

技术标签:

【中文标题】Android主题覆盖所有颜色[重复]【英文标题】:Android theme overrides all colors [duplicate] 【发布时间】:2021-06-06 10:40:32 【问题描述】:

我有一个 XML 文件,它用颜色和可绘制对象定义了应用程序 UI,但它们似乎都被来自themes.xml 的主题所覆盖。如何禁用此功能?

例子:

这个按钮:

<Button
            android:id="@+id/capture_button"
            android:layout_
            android:background="@drawable/round_button"
            android:layout_
            android:text="@string/capture_button_text_en"
            android:textColor="@color/white"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/camera_activity_frameLayout">
</Button>

应该有一个黑色背景,因为它在 round_button.xml 中定义:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="@color/black"/>
    <corners android:radius="7dp"/>
    <stroke android: android:color="@color/white"/>
</shape>

不过是紫色,来自主题的颜色:

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.myproject" parent="Theme.MaterialComponents.DayNight.NoActionBar">
        <!-- 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. -->
    </style>
</resources>

如何覆盖这个主题?

【问题讨论】:

【参考方案1】:

由于您的应用程序的主题扩展了 Material Components 主题 (Theme.MaterialComponents.DayNight.NoActionBar),它将接管视图膨胀并将一些小部件替换为相应的 Material Components 之一。这意味着,如果您的视图定义了一个按钮,您将获得一个MaterialButton,因此它会改变您应该如何控制按钮的外观。您不应再使用背景属性,而是讨论here 和here 的属性。这个过程在this 博文中有更多解释。

现在要获得带有白色轮廓的黑色 MaterialButton,您想使用 Widget.MaterialComponents.Button.OutlinedButton 样式:

<Button
    android:id="@+id/capture_button"
    style="@style/Widget.MaterialComponents.Button.OutlinedButton"
    android:layout_
    android:layout_
    android:text="@string/capture_button_text_en"
    android:textColor="@color/white"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:shapeAppearance="@style/ShapeAppearance.MyApp.LargeComponent"
    app:backgroundTint="@color/black"
    app:strokeWidth="1dp"
    app:strokeColor="#ffffff"
    app:layout_constraintTop_toBottomOf="@+id/camera_activity_frameLayout"/>

您还需要在您的styles.xml 中添加以下内容,以使拐角圆角半径为 7dp(从您的原始背景可绘制对象中看到):

    <style name="ShapeAppearance.MyApp.LargeComponent" parent="ShapeAppearance.MaterialComponents.MediumComponent">
        <item name="cornerFamily">rounded</item>
        <item name="cornerSize">7dp</item>
    </style>

【讨论】:

以上是关于Android主题覆盖所有颜色[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Android5.0常用颜色属性说明

Bootstrap 4 - 在css中通过根名称引用颜色[重复]

在 Android Studio Gutter 中启用代码覆盖率指示

更改android应用程序的基本主题颜色

更改android菜单的背景颜色[重复]

将自定义主题添加到应用程序时出错