android中的强制黑暗模式没有响应 [英] force dark mode in android is not responding

查看:524
本文介绍了android中的强制黑暗模式没有响应的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试按照此处.因此,我将arrays.xml创建为:

I am trying to implement dark theme as described here. So, I have created arrays.xml as:

<resources>
  <array name="themes_labels">
    <item>"Default"</item>
    <item>"Light"</item>
    <item>"Dark"</item>
  </array>

  <string-array name="themes_color">
    <item>"Default"</item>
    <item>"Light"</item>
    <item>"Dark"</item>
  </string-array>
</resources>

这是我的代码,用于更改主题,该主题无效,即,主题未更改,尽管第一个Toast给出了正确的值,而第二个Toast切换前给出了一些神秘的值,例如16/32等

and this is my code to change the theme, which is not working, i.e., the theme is not changing, though the first Toast is giving correct value, where the 2nd Toast before switch gives some mysterious value like 16/32 etc.

我知道,我的值数组是键,在这里我试图读取开关中的一些int值.但是我不知道该怎么做.

I understand that, my value array is key, where I amy trying to read some int in the switch. But I am not getting how to get that.

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
String theme = sharedPref.getString("theme", "Default");
Toast.makeText(this, theme, Toast.LENGTH_LONG).show();
int currentNightMode = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
Toast.makeText(this, ""+currentNightMode, Toast.LENGTH_LONG).show();
switch (currentNightMode) {
  case Configuration.UI_MODE_NIGHT_NO:
    // Night mode is not active, we're using the light theme
    break;
  case Configuration.UI_MODE_NIGHT_YES:
    // Night mode is active, we're using dark theme
    break;
    default:
      AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
}

推荐答案

请尝试在下面使用的暗模式代码.

Try below dark mode code which I am use.

步骤-1

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

First of create night folder into your resource file like below image(i.e. values-night)

步骤-2

夜间模式创建样式,字符串和颜色 xml文件,与下图相同,并添加要在应用中显示的夜间模式的颜色,字符串和样式当应用夜间模式时.

Create styles,strings and colors xml file for night mode same as below image and add your night mode color,string and style which you want to show in your app when night mode was apply.

步骤-3

如果要在安装应用程序时第一次按设备模式设置夜间模式,请在启动屏幕中添加以下代码.

Add this below code in your splash screen if you want to set night mode as per device mode first time when application installed.

@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

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

Add this below code in your all activity

@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;
}

我希望这可以为您提供帮助!

I hope this can help you!

谢谢.

这篇关于android中的强制黑暗模式没有响应的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆