#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)
Я надеюсь, что это поможет вам!