📜  切换材质android教程-Java(1)

📅  最后修改于: 2023-12-03 15:36:50.976000             🧑  作者: Mango

切换材质 Android 教程 - Java

在 Android 应用程序中,我们通常需要在不同的场景下使用不同的材质(Material Design),例如在不同的主题、不同的版本,或者是用户的个性化设置下。本教程将介绍如何在 Android 应用程序中切换不同的材质,使用 Java 语言编写。

准备工作

在开始之前,需要在 Android Studio 的 build.gradle 文件中引入 material design 库:

implementation 'com.google.android.material:material:1.4.0'

同时,需要在 AndroidManifest.xml 文件中声明应用的主题:

<application
    ...
    android:theme="@style/AppTheme">
    ...
</application>

在 values 文件夹下(如果没有则需要新建),创建名为 colors.xml 的文件,定义应用程序的主色调和亮度等颜色属性:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#2196F3</color>
    <color name="colorPrimaryDark">#1976D2</color>
    <color name="colorAccent">#FF4081</color>
    <color name="colorSurface">#FFFFFF</color>
    <color name="colorOnSurface">#000000</color>
    <color name="colorBackground">#F2F2F2</color>
    <color name="colorOnBackground">#000000</color>
</resources>

在 styles.xml 文件中,定义应用程序的默认主题样式:

<resources>
    <style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:windowBackground">@color/colorBackground</item>
        <item name="android:statusBarColor">@color/colorPrimaryDark</item>
        <item name="android:navigationBarColor">@color/colorPrimaryDark</item>
        <item name="android:colorForeground">@color/colorOnSurface</item>
        <item name="android:colorBackground">@color/colorSurface</item>
        <item name="android:textColor">@color/colorOnBackground</item>
    </style>
</resources>
切换材质
切换主题

要切换主题,我们需要在代码中动态设置应用程序的主题样式。首先,我们需要定义一个名为 setTheme 的静态方法:

public static void setTheme(Context context, int themeId) {
    context.setTheme(themeId);
    SharedPreferences.Editor editor = context.getSharedPreferences("theme", Context.MODE_PRIVATE).edit();
    editor.putInt("current_theme", themeId);
    editor.apply();
    ((Activity) context).recreate();
}

该方法有两个参数,第一个参数是应用程序的 Context 对象,第二个参数是要设置的主题的 int 值。该方法将传入的主题值保存到 SharedPreferences 中,并调用 Activityrecreate() 方法重新创建 Activity

定义好了 setTheme 方法之后,我们需要在应用程序中调用该方法,例如在点击切换按钮时:

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if (getTheme() == R.style.Theme_MyApp_Light) {
            setTheme(MainActivity.this, R.style.Theme_MyApp_Dark);
        } else {
            setTheme(MainActivity.this, R.style.Theme_MyApp_Light);
        }
    }
});

在这个示例中,我们定义了两种主题样式 Theme_MyApp_LightTheme_MyApp_Dark,并在按钮的点击事件中根据当前的主题值切换不同的主题。

切换材质

要切换材质,我们需要在布局文件中使用 Material Design 的组件,并且根据当前主题设置不同的颜色值。例如,在使用 Button 组件时:

<com.google.android.material.button.MaterialButton
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="16dp"
    android:text="@string/switch_theme"
    app:backgroundTint="?attr/colorSecondary"
    app:rippleColor="?attr/colorSurface" />

在这个示例中,我们使用了 MaterialButton 组件,并设置了 backgroundTintrippleColor 属性。这两个属性的值都是 ?attr/xxx 的形式,代表使用当前主题中的对应颜色值,例如 ?attr/colorSecondary 代表当前主题中的 colorSecondary 对应的颜色值。

总结

通过本教程的学习,你已经了解了如何在 Android 应用程序中切换不同的主题和材质。同时,你也了解了如何使用 Material Design 的组件和颜色属性,为你的应用程序增添更多的美感和功能。