如何将 Material 主题应用到应用程序 (activity) 中的所有按钮?

How to apply Material Theme to all buttons in application (activity)?

我正在尝试自定义我的 Android 主题,但似乎没有任何效果。


Activity:
public class MainActivity extends AppCompatActivity {
...
}

themes.xml
<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.Delete" parent="Theme.MaterialComponents.Light">
        <!-- Primary brand color. -->
        <item name="colorPrimary">@color/primary</item>
        <item name="colorPrimaryVariant">@color/primary</item>
        <item name="colorOnPrimary">@color/white</item>
        <!-- Secondary brand color. -->
        <item name="colorSecondary">@color/primary</item>
        <item name="colorSecondaryVariant">@color/primary</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="materialButtonStyle">@style/Widget.App.Button</item>
    </style>

    <style name="Widget.App.Button" parent="Widget.MaterialComponents.Button">
        <item name="materialThemeOverlay">@style/ThemeOverlay.Button</item>
        <item name="colorPrimary">@color/primary</item>
    </style>

    <style name="ThemeOverlay.Button" parent="" >
        <!-- For filled buttons, your theme's colorPrimary provides the default background color of the component-->
        <item name="colorPrimary">@color/primary</item>
    </style>
</resources>

在布局中我使用 Material 设计组件 例如

            <com.google.android.material.button.MaterialButton
                android:id="@+id/button_home_all"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/home_all"
                app:layout_constraintStart_toStartOf="parent"/>

但默认的 purple_200 背景色应用于按钮。你能帮我一下吗?我读到我应该使用 Activity 而不是 AppCompatActivity 但我无法更改它,因为我的 activity 是底部导航 activity 我找不到对 onSupportNavigateUp 或其他相关内容


编辑

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="licenta.allbank">

 
    <application
        android:requestLegacyExternalStorage="true"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.AllBank" 
        android:usesCleartextTraffic="true">
        <activity
            android:name=".activity.MainActivity"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:label="@string/app_name"
            android:launchMode="singleInstance"
            android:windowSoftInputMode="adjustPan">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data
                    android:host="callback"
                    android:scheme="https" />
            </intent-filter>
        </activity>
    </application>
</manifest>

要使用 MaterialButton,您必须在应用中使用 Theme.MaterialComponents.* 主题。

然后你可以定义materialButtonStyle属性。

  <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.MaterialComponents.Light">
    ....

    <item name="materialButtonStyle">@style/Widget.App.Button</item>
  </style>

通过这种方式,您可以自定义应用中所有按钮的主题。

要覆盖默认背景颜色,您可以使用 materialThemeOverlay 属性:

  <style name="Widget.App.Button" parent="Widget.MaterialComponents.Button">
     <item name="materialThemeOverlay">@style/ThemeOverlay.Button</item>
  </style>

  <style name="ThemeOverlay.Button" parent="" >
    <!-- For filled buttons, your theme's colorPrimary provides the default background color of the component-->
    <item name="colorPrimary">@color/my_color</item>        
  </style>

否则,您可以在自定义样式中使用 backgroundTint 属性:

<style name="Widget.App.Button" parent="Widget.MaterialComponents.Button">
    <!-- Background color --> 
    <item name="backgroundTint">@color/buttonBackgroundSelector</item>
</style>  

想通了。如果您在物理设备上进行测试并且它设置为 暗模式 ,您应该在 values-night/themes.xml 文件中进行更改,否则,在 values/themes.xml应该够了