我有一个应用程序,用户可以从 PreferenceActivity
中选择几个不同颜色的主题,从而更改整个应用程序的主题/颜色。但在 PreferenceActivity
中选择的更改不会立即应用。仅当用户重新输入 PreferenceActivity
时才会应用更改。
我知道我可以在每次选择主题时调用 recreate()
,但我想知道是否存在更好的解决方案而无需重新创建整个 Activity 。
这是一段视频,展示了它目前是如何工作的: https://www.youtube.com/watch?v=oU8xIUi_48A
这是我在我的 PreferenceActivity 中设置从 preferenceList 中选择的值的地方:
@Override
public void onCreate(Bundle savedInstanceState) {
setTheme();
themecolorList.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
switch (themecolorList.getValue()) {
case "grey":
themecolorList.getEditor().putString("grey", "green").apply();
break;
case "green":
themecolorList.getEditor().putString("green", "green").apply();
setTheme(R.style.AppTheme_default);
break;
case "blue":
themecolorList.getEditor().putString("blue", "green").apply();
break;
case "yellow":
themecolorList.getEditor().putString("yellow", "green").apply();
break;
case "red":
themecolorList.getEditor().putString("red", "green").apply();
break;
case "pink":
themecolorList.getEditor().putString("pink", "green").apply();
break;
default:
themecolorList.getEditor().putString("green", "green").apply();
break;
}
recreate();
return true;
}
});
}
方法 setTheme();
在我的 PreferenceActivitys onCreate();
方法中被调用
private void setTheme() {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
switch (sharedPreferences.getString("THEME_KEY", "green")) {
case "grey":
setTheme(R.style.AppTheme_Grey);
break;
case "green":
setTheme(R.style.AppTheme_default);
break;
case "blue":
setTheme(R.style.AppTheme_Blue);
break;
case "yellow":
setTheme(R.style.AppTheme_Yellow);
break;
case "red":
setTheme(R.style.AppTheme_Red);
break;
case "pink":
setTheme(R.style.AppTheme_Pink);
break;
default:
getApplication().setTheme(R.style.AppTheme_default);
setTheme(R.style.AppTheme_default);
break;
}
}
最佳答案
似乎最好的解决方案是使用recreate()
;因为没有其他方法可以刷新 Activity 的整个布局:
每次用户按下主题列表中的选项时
按下的键/值通过 OnPreferenceChangeListener
保存在 SharedPreference
中,然后调用 recreate();
。
themecolorList.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
recreate();
return true;
}
});
在我的 PreferenceActivity
的 onCreate();
中,我调用了一个自定义方法 setTheme();
,它在 recreate 之后调用();
被调用。 setTheme();
只是从 OnPreferenceChangeListener
中查找保存在 SharedPreference
中的内容,并将主题设置为相应的值
@Override
public void onCreate(Bundle savedInstanceState) {
setTheme();
super.onCreate(savedInstanceState);
}
关于android - 如何在不重新启动 Activity 的情况下在android中应用主题/样式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37823231/