重新启动应用程序时,SharedPreferences 不保存布尔值
SharedPreferences not save boolean value when restart app
我正在开发一个在 DarkMode 主题中使用的应用程序,我将 Switch
设置为打开和关闭 darkMode,并将其保存在布尔值中,这意味着 darkMode 为真或假(boolean isDarkMode =false;
)
它运行良好,我使用 SharedPreferences
保存此 true 或 false 值以在其他活动中使用它。
它工作但是......
当我再次关闭应用程序和 运行 应用程序时,SharedPreferences 的值不会被保存,它会返回到布尔值的第一个值
(谢谢你)
SettingActivity.java(设置布尔值真或假)
package com.kurdfoxx.nightmodewithsharedprefrense;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.Switch;
import android.widget.Toast;
public class SettingActivity extends AppCompatActivity {
Switch mySwitch;
boolean isDarkMode =false;
private static final String DARKMODE = "login";
@Override
protected void onCreate(Bundle savedInstanceState) {
myboolian();
if (AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES) {
setTheme(R.style.darkTheme);
isDarkMode =true;
} else {
setTheme(R.style.AppTheme);
isDarkMode =false;
}
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_setting);
Toast.makeText(this, ""+ isDarkMode, Toast.LENGTH_SHORT).show();
mySwitch = findViewById(R.id.switch1);
if (AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES) {
mySwitch.setChecked(true);
}
mySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
isDarkMode =true;
restartApp();
} else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
isDarkMode =false;
restartApp();
}
}
});
Button buttonGoMain=findViewById(R.id.btn_go_MainAct);
buttonGoMain.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(SettingActivity.this,MainActivity.class));
}
});
}
public void restartApp() {
Intent intentRestartApp = new Intent(getApplicationContext(), SettingActivity.class);
startActivity(intentRestartApp);
finish();
}
public void myboolian(){
isDarkMode =!isDarkMode; //change isDarkMode from false to true by this
SharedPreferences sharedPreferences =getSharedPreferences(DARKMODE,MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean("ISDARKMODE", isDarkMode);
editor.apply();
}
}
和MainActivity.java
package com.kurdfoxx.nightmodewithsharedprefrense;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private static final String DARKMODE = "login";
boolean isDarkMode = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
getData();
if (isDarkMode){
if (AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES) {
setTheme(R.style.darkTheme);
isDarkMode =true;
} else {
setTheme(R.style.AppTheme);
isDarkMode =false;
}
}
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button=findViewById(R.id.button_go_to_setting_activity);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this,SettingActivity.class));
}
});
}
private void getData() {
SharedPreferences sharedPreferences = getSharedPreferences(DARKMODE, MODE_PRIVATE);
isDarkMode = sharedPreferences.getBoolean("ISDARKMODE", false);
}
}
在您的 checkedChangedListener 中,您将 darkMode 分别设置为 true
和 false
。
并且在您的 myboolian
方法中是您写入变量的唯一地方。
此方法仅 从您的onCreate
调用,其他地方均未调用。除此之外,此方法总是设置 darkMode = !darkMode
,交换值。
您必须在 onCheckedChanged 中调用 myboolian
并删除 darkMode = !darkMode
否则您将始终重置为之前的值。
感谢@Grisgram 的帮助
我通过一些更改解决了这个问题,并坚持
settingActivity.java
package com.kurdfoxx.nightmodewithsharedprefrense;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.Switch;
import android.widget.Toast;
public class SettingActivity extends AppCompatActivity {
public static Switch mySwitch;
boolean isDarkMode =false;
private static final String DARKMODE = "dark";
@Override
protected void onCreate(Bundle savedInstanceState) {
if (AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES) {
setTheme(R.style.darkTheme);
isDarkMode=true;
} else {
setTheme(R.style.AppTheme);
isDarkMode=false;
}
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_setting);
Toast.makeText(this, ""+ isDarkMode, Toast.LENGTH_SHORT).show();
mySwitch = findViewById(R.id.switch1);
if (AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES) {
mySwitch.setChecked(true);
}
mySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
isDarkMode=true;
myboolian();
restartApp();
} else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
isDarkMode=false;
myboolian();
restartApp();
}
}
});
myboolian();
Button buttonGoMain=findViewById(R.id.btn_go_MainAct);
buttonGoMain.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(SettingActivity.this,MainActivity.class));
}
});
}
public void restartApp() {
Intent intentRestartApp = new Intent(getApplicationContext(), SettingActivity.class);
startActivity(intentRestartApp);
finish();
}
public void myboolian(){
// isDarkMode =!isDarkMode; //change isDarkMode from false to true by this
SharedPreferences sharedPreferences =getSharedPreferences(DARKMODE,MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean("ISDARKMODE", isDarkMode);
editor.apply();
}
}
和主要 activity
package com.kurdfoxx.nightmodewithsharedprefrense;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private static final String DARKMODE = "dark";
boolean isDarkMode ;
@Override
protected void onCreate(Bundle savedInstanceState) {
getData();
Toast.makeText(this, "is datk ?"+isDarkMode, Toast.LENGTH_SHORT).show();
if (isDarkMode){
setTheme(R.style.darkTheme);
}else {setTheme(R.style.AppTheme);}
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button=findViewById(R.id.button_go_to_setting_activity);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this,SettingActivity.class));
}
});
}
private void getData() {
SharedPreferences sharedPreferences = getSharedPreferences(DARKMODE, MODE_PRIVATE);
isDarkMode = sharedPreferences.getBoolean("ISDARKMODE", false);
}
}
我正在开发一个在 DarkMode 主题中使用的应用程序,我将 Switch
设置为打开和关闭 darkMode,并将其保存在布尔值中,这意味着 darkMode 为真或假(boolean isDarkMode =false;
)
它运行良好,我使用 SharedPreferences
保存此 true 或 false 值以在其他活动中使用它。
它工作但是......
当我再次关闭应用程序和 运行 应用程序时,SharedPreferences 的值不会被保存,它会返回到布尔值的第一个值
(谢谢你)
SettingActivity.java(设置布尔值真或假)
package com.kurdfoxx.nightmodewithsharedprefrense;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.Switch;
import android.widget.Toast;
public class SettingActivity extends AppCompatActivity {
Switch mySwitch;
boolean isDarkMode =false;
private static final String DARKMODE = "login";
@Override
protected void onCreate(Bundle savedInstanceState) {
myboolian();
if (AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES) {
setTheme(R.style.darkTheme);
isDarkMode =true;
} else {
setTheme(R.style.AppTheme);
isDarkMode =false;
}
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_setting);
Toast.makeText(this, ""+ isDarkMode, Toast.LENGTH_SHORT).show();
mySwitch = findViewById(R.id.switch1);
if (AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES) {
mySwitch.setChecked(true);
}
mySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
isDarkMode =true;
restartApp();
} else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
isDarkMode =false;
restartApp();
}
}
});
Button buttonGoMain=findViewById(R.id.btn_go_MainAct);
buttonGoMain.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(SettingActivity.this,MainActivity.class));
}
});
}
public void restartApp() {
Intent intentRestartApp = new Intent(getApplicationContext(), SettingActivity.class);
startActivity(intentRestartApp);
finish();
}
public void myboolian(){
isDarkMode =!isDarkMode; //change isDarkMode from false to true by this
SharedPreferences sharedPreferences =getSharedPreferences(DARKMODE,MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean("ISDARKMODE", isDarkMode);
editor.apply();
}
}
和MainActivity.java
package com.kurdfoxx.nightmodewithsharedprefrense;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private static final String DARKMODE = "login";
boolean isDarkMode = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
getData();
if (isDarkMode){
if (AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES) {
setTheme(R.style.darkTheme);
isDarkMode =true;
} else {
setTheme(R.style.AppTheme);
isDarkMode =false;
}
}
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button=findViewById(R.id.button_go_to_setting_activity);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this,SettingActivity.class));
}
});
}
private void getData() {
SharedPreferences sharedPreferences = getSharedPreferences(DARKMODE, MODE_PRIVATE);
isDarkMode = sharedPreferences.getBoolean("ISDARKMODE", false);
}
}
在您的 checkedChangedListener 中,您将 darkMode 分别设置为 true
和 false
。
并且在您的 myboolian
方法中是您写入变量的唯一地方。
此方法仅 从您的onCreate
调用,其他地方均未调用。除此之外,此方法总是设置 darkMode = !darkMode
,交换值。
您必须在 onCheckedChanged 中调用 myboolian
并删除 darkMode = !darkMode
否则您将始终重置为之前的值。
感谢@Grisgram 的帮助 我通过一些更改解决了这个问题,并坚持
settingActivity.java
package com.kurdfoxx.nightmodewithsharedprefrense;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.Switch;
import android.widget.Toast;
public class SettingActivity extends AppCompatActivity {
public static Switch mySwitch;
boolean isDarkMode =false;
private static final String DARKMODE = "dark";
@Override
protected void onCreate(Bundle savedInstanceState) {
if (AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES) {
setTheme(R.style.darkTheme);
isDarkMode=true;
} else {
setTheme(R.style.AppTheme);
isDarkMode=false;
}
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_setting);
Toast.makeText(this, ""+ isDarkMode, Toast.LENGTH_SHORT).show();
mySwitch = findViewById(R.id.switch1);
if (AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES) {
mySwitch.setChecked(true);
}
mySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
isDarkMode=true;
myboolian();
restartApp();
} else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
isDarkMode=false;
myboolian();
restartApp();
}
}
});
myboolian();
Button buttonGoMain=findViewById(R.id.btn_go_MainAct);
buttonGoMain.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(SettingActivity.this,MainActivity.class));
}
});
}
public void restartApp() {
Intent intentRestartApp = new Intent(getApplicationContext(), SettingActivity.class);
startActivity(intentRestartApp);
finish();
}
public void myboolian(){
// isDarkMode =!isDarkMode; //change isDarkMode from false to true by this
SharedPreferences sharedPreferences =getSharedPreferences(DARKMODE,MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean("ISDARKMODE", isDarkMode);
editor.apply();
}
}
和主要 activity
package com.kurdfoxx.nightmodewithsharedprefrense;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private static final String DARKMODE = "dark";
boolean isDarkMode ;
@Override
protected void onCreate(Bundle savedInstanceState) {
getData();
Toast.makeText(this, "is datk ?"+isDarkMode, Toast.LENGTH_SHORT).show();
if (isDarkMode){
setTheme(R.style.darkTheme);
}else {setTheme(R.style.AppTheme);}
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button=findViewById(R.id.button_go_to_setting_activity);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this,SettingActivity.class));
}
});
}
private void getData() {
SharedPreferences sharedPreferences = getSharedPreferences(DARKMODE, MODE_PRIVATE);
isDarkMode = sharedPreferences.getBoolean("ISDARKMODE", false);
}
}