问题描述
我的应用程序中有一个settings-activity,用户可以在其中选择亮模式,暗模式,并通过三个单选按钮跟随系统。但是,当应用程序重新启动时,无论单选按钮上选择了什么,都将始终遵循该系统。我用SharedPreferences尝试过,但是没有用。我该如何解决?
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);
}
}
解决方法
我为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
,然后在onCreate方法中设置主题:
settingsSaveData = SettingsSaveData(this)
if (settingsSaveData.loadDarkMode() == true){
setTheme(R.style.DarkTheme)
}else{
setTheme(R.style.AppTheme)
}
super.onCreate(savedInstanceState)
我希望这会对您有所帮助!