[英]How can I persist my theme settings in android app?
主题在当前活动(设置活动)中更改,但我必须重新启动其他后台活动才能应用新主题。 我认为应该在设置活动中重新启动后台活动,但我找不到如何。
这是我的设置活动:
public class SettingsActivity extends FragmentActivity implements SharedPreferences.OnSharedPreferenceChangeListener {
private SharedPreferences prefs;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SettingsHelper.onActivityCreateSetTheme(this);
getSupportFragmentManager()
.beginTransaction()
.replace(android.R.id.content, new SettingsFragment())
.commit();
prefs = PreferenceManager.getDefaultSharedPreferences(this);
}
@Override
protected void onResume() {
super.onResume();
prefs.registerOnSharedPreferenceChangeListener(this);
}
@Override
protected void onPause() {
super.onPause();
prefs.unregisterOnSharedPreferenceChangeListener(this);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals("theme")) {
boolean isDark = prefs.getBoolean("theme", false);
prefs.edit().putBoolean("theme", isDark).apply();
SettingsHelper.changeToTheme(this);
}
}
在您的所有活动中,尝试将以下代码放在onResume()方法中:
@Override
public void onResume(){
super.onResume();
boolean isDark = prefs.getBoolean("theme", false);
if(!isDark){
recreate();
}
}
需要调用recreate()来重新创建活动,以便可以在当前屏幕上应用新主题。
没有什么叫做重启活动,它在后台并且仍然保留在后台。
您可以简单地完成此活动,以便下次开始使用新主题。
或者如果您的主题可以手动应用,那么您可以在它的onResume
(或onStart
,取决于您的逻辑)上应用新主题。
您还可以在onResume
重新创建活动(如果主题已更改)但我不建议这样做,因为这个简历是不必要的,您可以简单地使用第一个选项。
switch (cTheme)
{
case BLACK:
int myTheme = R.style.Default
activity.setTheme(myTheme);
//Save your activity theme color
saveTheme(myTheme);
break;
case YELLOW:
int myTheme = R.style.Green
activity.setTheme(myTheme);
//Save your activity theme color
saveTheme(myTheme);
break;
}
and change your onActivityCreateSetTheme(Activity activity) to:
public static void onActivityCreateSetTheme(Activity activity, Int cTheme)
Save method
public void saveTheme(int theme)
{
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = sharedPreferences.edit();
prefEditor.putInt("Theme",theme);
}
Load method
public int loadTheme(){
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
//Load theme color
int theme = sharedPreferences.getInt("Theme",Color.RED); //RED is default color, when nothing is saved yet
return theme;
}
Important: call loadTheme() before setContentView() so your onCreate() should be like:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int theme = loadTheme(); //Load your theme here!!!!
CustomazationProcess.onActivityCreateSetTheme(this, theme);
setContentView(R.layout.something1);
findViewById(R.id.black).setOnClickListener(this);
findViewById(R.id.yellow).setOnClickListener(this);
}
答案确实是重新创建活动,但只有在检查到onCreate的值与onResume上的值不同之后。 链接到相关的SO问题: 在运行时更改区域设置时刷新(重新创建)后台堆栈中的活动
@Override
protected void onCreate() {
super.onCreate()
preferences = PreferenceManager.getDefaultSharedPreferences(this);
isDark = preferences.getBoolean("theme", false);
}
@Override
protected void onResume() {
super.onResume();
if(isDark != preferences.getBoolean("theme", false))
recreate();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.