2013-04-06 231 views
0

嗨,我有一個顯示切換按鈕的活動。問題是,當我按下設備上的後退按鈕,然後回到我的活動時,按鈕的狀態被重置。Android切換按鈕狀態

我該怎麼做才能使活動「記住」按鈕在整個生命週期中的狀態?

+0

使用SharedPrefrences ... – Rahil2952 2013-04-06 07:57:53

+0

可能重複:http://stackoverflow.com/q/151777/1048087 – Prizoff 2013-04-06 08:12:11

+0

使用您在'的onCreate()'和'的onSaveInstanceState()獲取束'加載/保存按鈕狀態。首選項不應用於生命週期臨時存儲。 – 2013-04-06 08:51:17

回答

1

您必須將狀態保存在持久內存中。在這種情況下,我會說Shared Preferences是你最好的選擇。

類似的信息(與切換按鈕的活動內):

public void saveButtonState(boolean pressed) { 
    SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE); 
    SharedPreferences.Editor editor = sharedPreferences.edit(); 
    editor.putBoolean("TOGGLE_BUTTON_STATE", pressed); 
    editor.commit(); 
} 

然後在你的onCreate可以通過從SharedPreferences閱讀「TOGGLE_BUTTON_STATE」設置按鈕狀態。

+0

我有這個代碼: – user1071138 2013-04-06 08:07:34

+0

謝謝,我用這個,我解決了恢復狀態到onResume()方法;) – user1071138 2013-04-06 11:25:02

+0

不錯,考慮接受我的答案,所以問題得到解答 – jelgh 2013-04-06 11:45:12

2

執行此操作時onCreate()onResume()按您的要求:

SharedPreferences preferences = this.getSharedPreferences(Constants.SENDEVENT_PREFERENCE,Context.MODE_PRIVATE); 
if(preferences.getBoolean(Constants.SENDEVENT_PREFERENCE_SAVE_LIBRARY, false)) 
      lib.setChecked(true); 

而且在onCheckedChanged方法做到這一點:

if (buttonView == lib) { 
      if (isChecked) { 
       prefsEditor.putBoolean(Constants.SENDEVENT_PREFERENCE_SAVE_LIBRARY, 
         true); 
       prefsEditor.commit(); 
      } else { 
       prefsEditor.putBoolean(Constants.SENDEVENT_PREFERENCE_SAVE_LIBRARY, 
         false); 
       prefsEditor.commit(); 
      } 
} 
1

的原因,爲什麼狀態reseted的是,你的活動完全銷燬,然後由於Android架構再次恢復。要存儲按鈕的狀態,您應該將其狀態保存到onSaveInstaceState()中的Bundle中並在onRestoreInstanceState()中恢復 - 這些方法專爲這類任務設計。

因此,答案是,你應該落實節能/兩種方法恢復按鈕狀態:

@Override 
protected void onSaveInstanceState (Bundle outState) { 
    // Your code here 
} 

@Override 
protected void onRestoreInstanceState (Bundle savedInstanceState) { 
    // Your code here 
} 

詳細信息docs看到:

注意「Killable」列在上面的表 - 對於那些標記爲可壓縮的方法,在該方法返回之後,託管該活動的進程可能隨時被系統殺死,而沒有執行其代碼的另一行。因此,您應該使用onPause()方法將任何持久性數據(如用戶編輯)寫入存儲。另外,在將活動置於這種背景狀態之前調用onSaveInstanceState(Bundle)方法,允許您將活動中的任何動態實例狀態保存到給定的Bundle中,以便稍後在onCreate(Bundle)中接收,如果活動需要重新創建。有關流程生命週期與其託管活動關聯的詳細信息,請參閱流程生命週期部分。請注意,將持久數據保存在onPause()而不是onSaveInstanceState(Bundle)中非常重要,因爲後者不是生命週期回調的一部分,所以在其文檔中所述的每種情況下都不會調用它。