根据我的研究,Android没有实用的方法来改变整体应用程序主题。
我的应用程序有点简单,活动明智,我认为这种处理主题更改的方法是安全的。
我想知道下面的方法是否安全,或者这是一个黑客工作,还有更好的方法来实现应用程序范围的主题?
注意:
MainActivtiy.java
是SettingsActivty.java
SettingsActivity.java
扩展PreferenceActivty
以显示典型的偏好设置屏幕。主题设置存储在R.string.colorThemeListPrefStr
标识的默认共享首选项中,其中android:entryValues
为{" 0"," 1"}
Settings.java
只是一个静态变量类,当应用程序在内存中时是安全的,需要在会话之间保存的任何内容都会在onPause()
期间保存到共享首选项。
MainActivity.java:
public class MainActivity extends ListActivity implements OnClickListener{
public void onCreate(Bundle savedInstanceState) {
sp = PreferenceManager.getDefaultSharedPreferences(this);
// get the int representing the theme selected from shared preferences
switch (Integer.valueOf(sp.getString(getString(R.string.colorThemeListPrefStr), Settings.DEFAULT_COLOR_THEME_INDEX))) {
case 0:
super.setTheme(android.R.style.Theme_Light);
break;
case 1:
super.setTheme(android.R.style.Theme_Black);
break;
}
super.onCreate(savedInstanceState);
// ...
}
public void onPause() {
super.onPause();
// ...
// store the current theme int
Settings.currentTheme = Integer.valueOf(sp.getString(getString(R.string.colorThemeListPrefStr), Settings.DEFAULT_COLOR_THEME_INDEX));
// ...
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.inputSettingsButton:
startActivityForResult(new Intent(this, SettingsActivity.class), Settings.PREFERENCES_REQUEST_CODE);
break;
// ...
}
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case Settings.PREFERENCES_REQUEST_CODE:
// check if the new and old themes are different
if (Settings.currentTheme != Integer.valueOf(sp.getString(getString(R.string.colorThemeListPrefStr), Settings.DEFAULT_COLOR_THEME_INDEX))) {
this.finish();
startActivity(new Intent(this, MainActivity.class));
}
break;
// ...
}
}
}
答案 0 :(得分:3)
您应该使用Application
附带的这一简单的一行代码重新启动support library
。
startActivity(IntentCompat.makeRestartActivityTask(getActivity().getComponentName()));