更改并未应用于所有活动
Changes are not applied to all the activities
我在我的 app.User 中实现了夜间模式,可以在配置文件中更改夜间模式设置 activity.The 活动顺序如下。
TabbedActivity>>DisplayActivity,ProfileActivity
更改的设置仅适用于当前 activity。(即个人资料 activity)。如果用户按下后退按钮,更改不会应用到那个 activities.Anyone 帮助我将更改应用于所有 activites.When 我们关闭应用程序并打开 again.changes 是 applied.But 后按不起作用。
这是我正在使用的代码。
@Override
protected void onCreate(Bundle savedInstanceState) {
final SharedPreferences sharedPreferences =
getSharedPreferences("NIGHT_MODE", MODE_PRIVATE);
int result=sharedPreferences.getInt("NIGHT_MODE_OPTION",0);
if (result==2){
setTheme(R.style.darkTheme);
}else setTheme(R.style.AppTheme);
loadLocale();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_profile);
final SharedPreferences.Editor editor = getSharedPreferences("NIGHT_MODE", MODE_PRIVATE).edit();
if (result==2){
night.setChecked(true);
}
night.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked){
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
editor.putInt("NIGHT_MODE_OPTION",AppCompatDelegate.MODE_NIGHT_YES);
editor.apply();
startActivity(getIntent());
}else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
editor.putInt("NIGHT_MODE_OPTION",AppCompatDelegate.MODE_NIGHT_NO);
editor.apply();
startActivity(getIntent());
}
}
});
}
因为您没有考虑Android生命周期。您在 onCreate
中配置所有内容。但是,在活动之间切换时,当前 activity 的生命周期会相应地发生变化。 Here 生命周期解释得很好
解法:
当你回到之前的activity时,onResume
被调用。您应该在此方法中应用所有更改
override fun onResume() {
super.onResume()
//Read your settings from SharedPrefs then apply, here
}
'i think the better practice would to restart/reset app everytime the theme is changed'
Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage(
getBaseContext().getPackageName() );
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i); finish();
我在我的 app.User 中实现了夜间模式,可以在配置文件中更改夜间模式设置 activity.The 活动顺序如下。
TabbedActivity>>DisplayActivity,ProfileActivity
更改的设置仅适用于当前 activity。(即个人资料 activity)。如果用户按下后退按钮,更改不会应用到那个 activities.Anyone 帮助我将更改应用于所有 activites.When 我们关闭应用程序并打开 again.changes 是 applied.But 后按不起作用。
这是我正在使用的代码。
@Override
protected void onCreate(Bundle savedInstanceState) {
final SharedPreferences sharedPreferences =
getSharedPreferences("NIGHT_MODE", MODE_PRIVATE);
int result=sharedPreferences.getInt("NIGHT_MODE_OPTION",0);
if (result==2){
setTheme(R.style.darkTheme);
}else setTheme(R.style.AppTheme);
loadLocale();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_profile);
final SharedPreferences.Editor editor = getSharedPreferences("NIGHT_MODE", MODE_PRIVATE).edit();
if (result==2){
night.setChecked(true);
}
night.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked){
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
editor.putInt("NIGHT_MODE_OPTION",AppCompatDelegate.MODE_NIGHT_YES);
editor.apply();
startActivity(getIntent());
}else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
editor.putInt("NIGHT_MODE_OPTION",AppCompatDelegate.MODE_NIGHT_NO);
editor.apply();
startActivity(getIntent());
}
}
});
}
因为您没有考虑Android生命周期。您在 onCreate
中配置所有内容。但是,在活动之间切换时,当前 activity 的生命周期会相应地发生变化。 Here 生命周期解释得很好
解法:
当你回到之前的activity时,onResume
被调用。您应该在此方法中应用所有更改
override fun onResume() {
super.onResume()
//Read your settings from SharedPrefs then apply, here
}
'i think the better practice would to restart/reset app everytime the theme is changed'
Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage(
getBaseContext().getPackageName() );
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i); finish();