我有一个应用程序,用户可以从PreferenceActivity
中选择几个不同颜色的主题,从而更改整个应用程序的主题/颜色。但PreferenceActivity
中选择的更改不会立即生效。仅当用户重新进入 PreferenceActivity
时才会应用更改。
我知道每次选择主题时我都可以调用recreate()
,但我想知道在不重新创建整个活动的情况下是否存在更好的解决方案。
以下是目前工作原理的视频: 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;
}
});
}
在我的PreferenceActivity setTheme();
方法
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;
}
}
答案 0 :(得分:6)
似乎最好的解决方案是使用recreate()
;因为没有其他方法可以刷新活动的整个布局:
每次用户按主题列表中的选项时
通过OnPreferenceChangeListener
中的SharedPreference
保存已按下的键/值,然后调用recreate();
。
themecolorList.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
recreate();
return true;
}
});
在我的PreferenceActivity
onCreate();
中,我调用了在调用setTheme();
后调用的自定义方法recreate();
。 setTheme();
只会从SharedPreference
中查找OnPreferenceChangeListener
中保存的内容,并将主题设置为相应的值
@Override
public void onCreate(Bundle savedInstanceState) {
setTheme();
super.onCreate(savedInstanceState);
}
答案 1 :(得分:0)
你不能。 您可以开始一个新活动来选择主题,以及用户何时选择完成该活动。
答案 2 :(得分:0)
触发布局更新(通过旋转设备,或让应用程序认为它已旋转)通常应该使其重新加载其资源。
我现在还不记得到底是怎么做的,但这是我上次调查如何做类似事情的常见做法。 只记得指定(在清单中?)您的活动将处理布局更改/屏幕旋转以避免完全重启(以及丢失任何未保存的数据)。
答案 3 :(得分:0)