📜  如何在 android 应用程序代码中停止在暗模式下反转颜色变化 (1)

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

如何在 Android 应用程序代码中停止在暗模式下反转颜色变化

在 Android Q (10.0)之后,系统带来了“暗模式”这一功能,使得应用程序可以根据系统的颜色模式切换不同的主题颜色,以适应不同的环境和用户需求。然而,在某些情况下,您希望应用程序不会在暗模式下反转颜色变化,而是保持原有的主题颜色。本文将介绍如何在 Android 应用程序代码中停止在暗模式下反转颜色变化的方法。

方法一:使用 res/values-night 目录

一种常见的方法是利用 Android 的资源目录来存放在不同主题下的资源文件,例如在 res/values 目录下存放白色主题下的资源文件,在 res/values-night 目录下存放黑色主题下的资源文件。这样,在切换主题时系统会自动加载相应的资源文件,从而达到不同主题下的不同资源视觉效果。具体步骤如下:

  1. res/values 目录下创建一个 themes.xml 文件,并定义您应用程序的主题颜色,例如:
<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">#ffffffff</item>
        <item name="colorSecondary">#cccccc</item>
        ...
    </style>
</resources>
  1. res/values-night 目录下创建一个 themes.xml 文件,并定义您应用程序在暗模式下的主题颜色,例如:
<resources>
    <style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="colorPrimary">#000000</item>
        <item name="colorSecondary">#666666</item>
        <item name="android:windowBackground">#222222</item>
        ...
    </style>
</resources>
  1. AndroidManifest.xml 文件中,将应用程序的主题设置为 @style/AppTheme,例如:
<application
    android:theme="@style/AppTheme" >
    ...
</application>
  1. res/layout 目录下创建一个 activity_main.xml 文件,并引用您应用程序中需要使用的颜色资源,例如:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="?attr/colorPrimary"
    ...>
    ...
</RelativeLayout>
  1. 编译并运行您的应用程序,查看您的应用程序是否在主题切换时自动加载相应的资源文件,并达到预期的不同视觉效果。
方法二:使用 AppCompatDelegate.setDefaultNightMode() 方法

另外一种更加灵活的方法是使用 AppCompatDelegate.setDefaultNightMode() 方法来控制当前主题的颜色模式。具体步骤如下:

  1. build.gradle 文件中,添加以下依赖:
implementation 'androidx.appcompat:appcompat:1.2.0'
  1. Application 类中重写 onCreate() 方法,调用 AppCompatDelegate.setDefaultNightMode() 方法来控制当前主题的颜色模式,例如:
public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        // 设置当前主题的颜色模式为“跟随系统”,即系统在暗模式下时,则应用程序自动进入暗模式
        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
    }
}
  1. 在您想要控制主题变化的页面中,调用 getDelegate().setLocalNightMode() 方法来动态改变主题的颜色模式,例如:
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // 将当前主题的颜色模式设置为“不跟随系统”,即不受系统暗模式影响
        getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_NO);
    }
}
  1. 编译并运行您的应用程序,查看您的应用程序的主题是否在运行时动态改变,达到预期的视觉效果。
结论

本文介绍了两种在 Android 应用程序代码中控制主题和颜色模式的方法,希望对您在开发应用程序时设计不同主题和颜色模式有所帮助。根据您应用程序的需要选择合适的方式来实现主题和颜色模式的控制,在不同的环境下为用户提供更加舒适和人性化的体验。