Android Помните темную тему - PullRequest
0 голосов
/ 01 августа 2020

Я пытаюсь создать темную тему для своего приложения. Пока все хорошо, но когда я закрываю приложение, оно не запоминает установленную темную тему.

Я меняю темную тему следующим образом:

    public static void setDarkMode(Object value, SharedPreferences preferences) {
        SharedPreferences.Editor editor = preferences.edit();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            if (value.equals("on")) {
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
                editor.putString("dark_theme", (String) value);
                editor.apply();
            } else if (value.equals("off")) {
                Log.i(TAG, "off");
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
                editor.putString("dark_theme", (String) value);
                editor.apply();
            } else if (value.equals("follow_system")) {
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
                editor.putString("dark_theme", (String) value);
                editor.apply();
            } else {
                Log.e(TAG, "Dark Mode Preferences android Q+ did not give the right value");
            }
        } else {
            if ((boolean) value) {
                Log.i(TAG, "Set night mode on");
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
                editor.putBoolean("dark_theme", (boolean) value);
                editor.apply();
            } else {
                Log.i(TAG, "set night mode off");
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
                editor.putBoolean("dark_theme", (boolean) value);
                editor.apply();
            }
        }
    }

И в MainActivity я пытаюсь установить режим, вызывая метод setDayNightMode(), но он всегда устанавливает MODE_NIGHT_FOLLOW_SYSTEM.

    private void setDayNightMode() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            Log.i(TAG, "Build version >= Q");
            String setting = settings.getString("dark_theme", "follow_system");
            if (setting.equals(getResources().getString(R.string.on))) {
                Log.i(TAG, "night mode on");
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
            } else if (setting.equals(getResources().getString(R.string.off))) {
                Log.i(TAG, "Night mode off");
                AppCompatDelegate.setDefaultNightMode((AppCompatDelegate.MODE_NIGHT_NO));
            } else if (setting.equals(getResources().getString(R.string.follow_sys))) {
                Log.i(TAG, "Night mode follow system");
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
            }
        } else {
            Boolean setting = settings.getBoolean("dark_theme", false);
            if(setting) {
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
            } else if (!setting) {
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
            }
        }
    }

Кажется, что SharedPreferences settings, который определяется как this.getSharedPreferences(getResources().getString(R.string.dark_theme_preference_key), MODE_PRIVATE), всегда вернуть значение follow_system. Вы знаете, как запомнить темный режим в приложении?

1 Ответ

0 голосов
/ 01 августа 2020

Используйте Общие настройки , когда пользователь изменяет тему вашего приложения в настройках. Затем, когда пользователь запускает приложение, в основном действии в onCreate загрузите пару значений ключа и установите тему в соответствии с сохраненным выбором пользователя

...