【问题标题】:How to have a properly Dark and Light Theme with Splash Screen如何使用初始屏幕制作正确的深色和浅色主题
【发布时间】:2020-02-11 07:58:43
【问题描述】:

我读到有一种方法可以拥有一个 values-night 和一个 values 文件夹。但是由于我的启动画面,如何在开始之前将值从值更改为值。我知道,由于 WhatsApp,必须有一种方法可以拥有一个以黑暗和光明为主题的启动画面。

如何在启动画面显示之前更改为夜间值?

【问题讨论】:

    标签: android android-layout


    【解决方案1】:

    试试下面我正在使用的暗模式代码。

    步骤 - 1

    首先在您的资源文件中创建 night 文件夹,如下图所示(即 values-night)

    步骤 - 2

    夜间模式创建样式、字符串和颜色 xml文件,如下图所示,并添加您想要在应用中显示的夜间模式颜色、字符串和样式何时应用夜间模式。

    为了更好的用户体验,在您的风格中添加窗口动画

    值 --> style.xml

    <resources xmlns:tools="http://schemas.android.com/tools">
    
        <!-- Base application theme. -->
        <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
            <!-- Customize your theme here. -->
            <item name="colorPrimary">@color/colorPrimary</item>
            <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
            <item name="colorAccent">@color/colorAccent</item>
        </style>
    
        <style name="NoActionBarAppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
            <!-- Customize your theme here. -->
            <item name="colorPrimary">@color/white</item>
            <item name="colorPrimaryDark">@color/white</item>
            <item name="colorAccent">@color/main_click_txt</item>
            <item name="android:windowLightStatusBar" tools:targetApi="m">true</item>
        </style>
    
        <!-- Add this theme where you change mode -->
        <style name="NoActionBarWithChangeTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
            <!-- Customize your theme here. -->
            <item name="colorPrimary">@color/white</item>
            <item name="colorPrimaryDark">@color/white</item>
            <item name="colorAccent">@color/main_click_txt</item>
            <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
            <item name="android:windowLightStatusBar" tools:targetApi="m">true</item>
        </style>
    
        <!-- This will set the fade in animation on your change theme activity by default -->
        <style name="WindowAnimationTransition">
            <item name="android:windowEnterAnimation">@anim/fade_in</item>
            <item name="android:windowExitAnimation">@anim/fade_out</item>
        </style>
    
    </resources>
    

    values-night --> style.xml

    <!-- Base application theme. values-night.xml -->
    <style name="NoActionBarAppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/white</item>
        <item name="colorPrimaryDark">@color/white</item>
        <item name="colorAccent">@color/main_click_txt</item>
        <item name="android:windowLightStatusBar" tools:targetApi="m">true</item>
    </style>
    
    <!-- Add this theme where you change mode -->
    <style name="NoActionBarWithChangeTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/white</item>
        <item name="colorPrimaryDark">@color/white</item>
        <item name="colorAccent">@color/main_click_txt</item>
        <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
        <item name="android:windowLightStatusBar" tools:targetApi="m">true</item>
    </style>
    
    <!-- This will set the fade in animation on your change activity by default -->
    <style name="WindowAnimationTransition">
        <item name="android:windowEnterAnimation">@anim/fade_in</item>
        <item name="android:windowExitAnimation">@anim/fade_out</item>
    </style>
    

    fade_in.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/linear_interpolator">
        <alpha
            android:duration="2000"
            android:fromAlpha="0.0"
            android:toAlpha="1.0">
        </alpha>
    </set>
    

    fade_out.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@android:anim/linear_interpolator">
        <alpha
            android:duration="2000"
            android:fromAlpha="1.0"
            android:toAlpha="0.0" >
        </alpha>
    </set>
    

    步骤 - 3

    如果您想在第一次安装应用程序时根据设备模式设置夜间模式,请在您的启动画面中添加以下代码。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        if (!CommonUtils.isToogleEnabled(SplashActivity.this)) {
            if (CommonUtils.isDarkMode(SplashActivity.this)) {
                CommonUtils.setIsNightModeEnabled(SplashActivity.this, true);
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
            } else {
                CommonUtils.setIsNightModeEnabled(SplashActivity.this, false);
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
            }
        } else {
            if (CommonUtils.isNightModeEnabled(SplashActivity.this)) {
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
            } else {
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
            }
        }
        super.onCreate(savedInstanceState);
    
        ...
        //your code
    }
    

    步骤 - 4

    在您的所有活动中添加以下代码

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        if (CommonUtils.isNightModeEnabled(MainActivity.this)) {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
        } else {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
        }
        super.onCreate(savedInstanceState);
    
        ...
        //your code
    }
    

    步骤 - 5

    改变模式使用下面的代码

    private WeakReference<Activity> mActivity;
    
    binding.imgNightMode.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mActivity = new WeakReference<Activity>(MainActivity.this);
            CommonUtils.setIsToogleEnabled(MainActivity.this, true);
            if (CommonUtils.isNightModeEnabled(MainActivity.this)) {
                CommonUtils.setIsNightModeEnabled(MainActivity.this, false);
                mActivity.get().recreate();
            } else {
                CommonUtils.setIsNightModeEnabled(MainActivity.this, true);
                mActivity.get().recreate();
            }
        }
    });
    

    以下方法是 CommonUtils

    private static final String NIGHT_MODE = "NIGHT_MODE";
    private static final String TOOGLE = "TOOGLE";
    
    public static boolean isNightModeEnabled(Context context) {
        SharedPreferences mPrefs = context.getSharedPreferences("MY_PREF", MODE_PRIVATE);
        return mPrefs.getBoolean(NIGHT_MODE, false);
    }
    
    public static void setIsNightModeEnabled(Context context, boolean isNightModeEnabled) {
        SharedPreferences mPrefs = context.getSharedPreferences("MY_PREF", MODE_PRIVATE);
        SharedPreferences.Editor editor = mPrefs.edit();
        editor.putBoolean(NIGHT_MODE, isNightModeEnabled);
        editor.apply();
    }
    
    public static void setIsToogleEnabled(Context context, boolean isToogleEnabled) {
        SharedPreferences mPrefs = context.getSharedPreferences("MY_PREF", MODE_PRIVATE);
        SharedPreferences.Editor editor = mPrefs.edit();
        editor.putBoolean(TOOGLE, isToogleEnabled);
        editor.apply();
    }
    
    public static boolean isToogleEnabled(Context context) {
        SharedPreferences mPrefs = context.getSharedPreferences("MY_PREF", MODE_PRIVATE);
        return mPrefs.getBoolean(TOOGLE, false);
    }
    
    public static boolean isDarkMode(Activity activity) {
        return (activity.getResources().getConfiguration()
                .uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES;
    }
    

    希望对你有帮助!

    谢谢。

    【讨论】:

    • 从 AppCompat v1.1.0 开始,setDefaultNightMode() 会自动重新创建任何已启动的活动。
    猜你喜欢
    • 2022-11-09
    • 2022-08-12
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 2019-11-13
    • 2017-11-16
    • 1970-01-01
    • 2021-12-21
    相关资源
    最近更新 更多