Как я могу сохранить состояние ночного режима в моем приложении для Android?

#java #android #application-settings #android-night-mode

#java #Android #приложение-настройки #android-ночной режим

Вопрос:

В моем приложении есть действие с настройками, где пользователь может выбирать между светлым режимом, темным режимом и следить за системой с помощью трех переключателей. Но когда приложение перезапускается, система всегда применяется независимо от того, что выбрано на переключателях. Я попробовал это с помощью SharedPreferences, но это не сработало. Как я могу это исправить?

Класс Java:

 package com.example.formelrechner;

import...

public class Einstellungen extends AppCompatActivity {

    RadioGroup radioGroup;
    RadioButton radioButton, radioButton2, radioButton3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        if (AppCompatDelegate.getDefaultNightMode()==AppCompatDelegate.MO DE_NIGHT_YES) {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
        }

        if (AppCompatDelegate.getDefaultNightMode()==AppCompatDelegate.MODE_NIGHT_NO) {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
        }

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_einstellungen);


        radioGroup = findViewById(R.id.radiogroup);
        radioButton = findViewById(R.id.radioButton);
        radioButton2 = findViewById(R.id.radioButton2);
        radioButton3 = findViewById(R.id.radioButton3);

        radioButton.setChecked(Update("SaveStateOne"));
        radioButton2.setChecked(Update("SaveStateTwo"));
        radioButton3.setChecked(Update("SaveStateThree"));



        radioButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean one_isChecked) {
                SaveintosharedPrefs("SaveStateOne", one_isChecked);
                if (one_isChecked) {
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);

                }
            }
        });

        radioButton2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean two_isChecked) {
                SaveintosharedPrefs("SaveStateTwo", two_isChecked);
                if (two_isChecked) {
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
                }
            }
        });

        radioButton3.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean three_isChecked) {
                SaveintosharedPrefs("SaveStateThree", three_isChecked);
                if (three_isChecked) {
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
                }
            }
        });

    }

    private void SaveintosharedPrefs(String key, boolean value) {

        SharedPreferences sp = getSharedPreferences("SaveState",MODE_PRIVATE);
        final SharedPreferences.Editor editor = sp.edit();

        editor.putBoolean(key,value);
        editor.apply();
    }

    private boolean Update(String key) {

        SharedPreferences sp = getSharedPreferences("SaveState",MODE_PRIVATE);
        return sp.getBoolean(key, false);
    }

}  

Комментарии:

1. я не вижу, где вы читаете из общих префиксов, чтобы определить, какой параметр применить?

2. вы сохраняете эти значения в общих префиксах, откуда вы их читаете? похоже, у вас нет проблем с сохранением состояния, похоже, у вас проблемы с его чтением и применением

Ответ №1:

Я сделал то же самое для своего приложения в Kotlin. Но вы можете преобразовать его в java, это почти то же самое.

Вам нужно создать новый класс для совместного использования настроек:

 class SettingsSaveData(context:Context) {

private var sharedPreferences: SharedPreferences =context.getSharedPreferences("file", Context.MODE_PRIVATE)

fun setDarkMode(state: Boolean){
    val editor = sharedPreferences.edit()
    editor.putBoolean("Dark", state)
    editor.apply()
}

fun loadDarkMode(): Boolean? {
    val state = sharedPreferences.getBoolean("Dark", false)
    return (state)
}
  

}

В ваших настройках вам нужно иметь что-то вроде этого:

 class SettingsActivity : AppCompatActivity() {   
   private lateinit var settingSaveData: SettingsSaveData

override fun onCreate(savedInstanceState: Bundle?) {
    settingSaveData = SettingsSaveData(this)  // make sure to setTheme here
    if (settingSaveData.loadDarkMode() == true){  // before onCreate method
        setTheme(R.style.DarkTheme)
    }else{
        setTheme(R.style.AppTheme)
    }

    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_settings)

    if(settingSaveData.loadDarkMode() == true){
        switch_theme.isChecked = true            // switch_theme is my Switch
    }

    switch_theme.setOnCheckedChangeListener { _, isChecked ->
        if (isChecked) {
            settingSaveData.setDarkMode(true)
            restartApplication()
        }else{
            settingSaveData.setDarkMode(false)
            restartApplication()
    }  
private fun restartApplication(){
    val i = Intent(applicationContext, SettingsActivity::class.java)
    startActivity(i)
    finish()
}
  

Во всех ваших действиях вам просто нужно объявить:

 private lateinit var settingsSaveData:SettingsSaveData
  

и setTheme в вашем методе onCreate:

  settingsSaveData = SettingsSaveData(this)
    if (settingsSaveData.loadDarkMode() == true){
        setTheme(R.style.DarkTheme)
    }else{
        setTheme(R.style.AppTheme)
    }
    super.onCreate(savedInstanceState)
  

Я надеюсь, что это поможет вам!