2013-03-22 109 views
3

我正在開發一個應用程序,其中我重寫了後退按鈕。我創建了一個複選框。在點擊其中我打電話的意圖爲:Android:onSaveInstanceState返回按鈕

startActivityforResult(); 

而且還保持活動的狀態爲:

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState); 
    savedInstanceState.putBoolean("checkbox", checkbox.isChecked()); 
} 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    checkbox_state = savedInstanceState.getBoolean("checkbox"); 
} 

其運行正常,並保持該狀態。 意思是我在編輯文本中輸入值。然後在複選框中單擊調用結果的新活動,並在首次活動返回時保持狀態。

現在,但從第二個活動,如果我點擊設備後退按鈕狀態不維護。

那麼我應該怎麼做才能保持後退按鈕的狀態。我搜索但沒有找到滿意的解決方案。請建議我。

回答

2

當您開始新的活動時,當前活動將被隱藏,並且新的活動被放置在堆棧頂部。現在,如果你按下新Activity上的後退按鈕,那麼第一個活動應該以當前狀態出現(如果它沒有被銷燬,則調用finish())它留在哪裏,即如果複選框被選中,則它應該保留檢查。除非方向改變或活動被破壞,否則不需要保存活動狀態。

你確定你沒有在onActivityResult或onResume()方法中做任何事情,這會影響複選框的狀態嗎?我建議首先註釋掉這兩種方法中的所有代碼,然後查看您的複選框是否保留了狀態。你也可以確保代碼本身不會在啓動新的Activity之前取消選中複選框嗎?

+0

我在activity2中的編輯文本中輸入了一些數據,並通過intent捕獲了activity1中的數據。 – 2013-03-22 12:40:30

1

現在,但從第二項活動,如果我點擊設備後退按鈕狀態不維護。

onSaveInstanceState()主要用於配置更改(例如旋轉屏幕)。

所以,我應該怎麼做,以保持後退按鈕

最有可能的,沒有「國家」,這需要「維護」,你的數據模型外的狀態。您的活動需要更新其數據模型:文件,數據庫,首選項,ContentProvider,某些單身是您的內存數據模型管理器,無論如何。

+0

可以說我有一個ListView,我從數據庫中填充。你認爲每當我從其他活動導航回數據庫時,我都應該從數據庫填充它?或者我應該保持適配器內容保存在狀態並重用它?就像知道你的承擔:) – 2013-05-02 15:16:06

+0

@ΕГИІИО:從數據庫填充是最安全的,因爲數據可能已經改變,因爲活動是上次。將它保存在狀態是最糟糕的選擇。中間地帶是維護某種數據模型管理單例,它可以緩存信息,並且是* all *活動對數據模型的訪問點。 – CommonsWare 2013-05-02 15:24:14

+0

它是最糟糕的,因爲它浪費資源?如果你知道在這兩個活動之間導航時數據沒有得到更新,那麼從狀態中恢復它會不會更響應?因爲我討厭在我的導航或當我旋轉屏幕時看到'loading please wait ...'東西:) – 2013-05-02 15:37:22