2012-09-08 36 views
11

我有一個擴展LinearLayout的自定義視圖。我已經實現onSaveInstanceState()和onRestoreInstanceState()來保存當前的視圖狀態。但是沒有采取任何行動。當我在這兩種方法中放置一個日誌時,Log Cat中也不會顯示任何內容。我認爲這兩種方法甚至沒有被調用。任何人都可以解釋問題出在哪裏?謝謝。onSaveInstanceState()和onRestoreInstanceState(Parcelable狀態)是否不被調用?

@Override 
public Parcelable onSaveInstanceState() { 
    Bundle bundle = new Bundle(); 
    bundle.putParcelable("instanceState", super.onSaveInstanceState()); 
    bundle.putInt("currentPage", currentPage); 
    return bundle; 
} 

@Override 
public void onRestoreInstanceState(Parcelable state) { 

    if (state instanceof Bundle) { 
     Bundle bundle = (Bundle) state; 
     currentPage = bundle.getInt("currentPage"); 
     Log.d("State", currentPage + ""); 
     super.onRestoreInstanceState(bundle.getParcelable("instanceState")); 
     return; 
    } 
     super.onRestoreInstanceState(state); 
    } 

回答

4

在Android操作系統中挖掘後,我終於想通了。正如我懷疑的那樣:這兩種方法沒有錯。他們只是不叫。 在Web上,您可以閱讀'在重新創建活動時調用onRestoreInsatnceState',好吧,它使感覺,但它不完全正確。是的,在重新創建活動時調用onRestoreInstanceState(),但僅在以下情況下調用:

它被操作系統殺死。 「這樣的情況發生時:

  • 的設備改變方向(你的活動被破壞並重新創建)
  • 有在你面前的另一項活動,並在某些時候OS殺死,爲了您的活動來釋放內存(例如)。下一次當你開始你的活動時,將調用RestoreInstanceState()。「

所以,如果你在你的活動,你打後退按鈕在設備上,你的活動是你開始你的應用程序被再次啓動(這聽起來像重新創建完成()版和接下來的時間,是不是?)但是這一次沒有保存狀態,因爲當你點擊返回按鈕時你有意退出它。

+6

我有完全相同的問題,但它是因爲我的自定義'View'沒有一個'id'集。從文檔_「請注意,即使凍結啓用,視圖仍然必須分配一個id(通過setId(int))來保存其狀態。」_ –

3

正如Steven Byle的評論所述,自定義View必須爲其分配一個用於調用onSaveInstanceState的ID。我做到了這一點在我的自定義View構造設置ID:

public class BoxDrawingView extends View { 
    private int BOX_DRAWING_ID = 555; 
    … 

    public BoxDrawingView(Context context, AttributeSet attrs) { 
     … 
     this.setId(BOX_DRAWING_ID); 
    } 
    … 

} 
+0

這很危險。如果您將在同一個佈局中添加多個「BoxDrawingView」,則所有這些將以與最後添加的狀態相同的狀態進行恢復! – Antimonit

+0

由於API級別有解決該問題的方法:使用View.generateViewId()請參閱:https://developer.android.com/reference/android/view/View.html#generateViewId() – bw15

相關問題