主题在当前活动(设置活动)中发生了变化,但是我必须重新启动其他后台活动才能应用新主题。我在想应该在设置活动中重新启动后台活动,但是我找不到方法。
这是我的设置活动:
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);
}
}
答案 0 :(得分:0)
在您所有的活动中,尝试将以下代码放在onResume()方法中:
@Override
public void onResume(){
super.onResume();
boolean isDark = prefs.getBoolean("theme", false);
if(!isDark){
recreate();
}
}
需要调用recreate()来重新创建活动,以便可以在当前屏幕上应用新主题。
答案 1 :(得分:0)
没有什么叫做重启活动,它处于后台并且仍然保持在后台。
您只需完成此活动,以便下次使用新主题即可。
或者如果可以手动应用主题,则可以在新主题onResume
(或onStart
,具体取决于您的逻辑)上应用新主题。
您也可以在onResume
上重新创建活动(如果更改了主题),但我不建议您这样做,因为此简历是不必要的,您可以仅使用第一个选项。
答案 2 :(得分:0)
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);
}
答案 3 :(得分:0)
答案确实是要重新创建活动,但只有在检查得到的值onCreate与一个onResume不同之后才能进行。 链接到相关的SO问题:Refresh(recreate) the activities in back stack when change locale at run time
@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();
}