1
從我研究的內容來看,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;
// ...
}
}
}