2014-05-01 79 views
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; 
      // ... 
     } 
    } 
} 

回答

3

,你可以重啓Application使用的代碼這個簡單的一行隨附support library

startActivity(IntentCompat.makeRestartActivityTask(getActivity().getComponentName())); 
相關問題