2012-06-20 73 views
34

可以使用savedInstanceState()保存刪除片段時的狀態,然後在將片段從背堆棧彈出時恢復狀態?當我從後端堆棧中恢復片段時,savedInstanceState bundle始終爲空。savedInstanceState從堆棧中恢復片段

現在,應用程序流程是:片段已創建 - >片段已移除(已添加到後退堆棧中) - >已從後退堆棧中恢復的片段(savedInstanceState包爲空)。

下面是相關代碼:

public void onActivityCreated(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Bundle bundle = getArguments(); 
    Long playlistId = bundle.getLong(Constants.PLAYLIST_ID); 
    int playlistItemId = bundle.getInt(Constants.PLAYLISTITEM_ID); 

    if (savedInstanceState == null) { 
     selectedVideoNumber = playlistItemId; 
    } else { 
     selectedVideoNumber = savedInstanceState.getInt("SELECTED_VIDEO"); 
    } 
} 

public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt(Constants.SELECTED_VIDEO, selectedVideoNumber); 
    } 

我認爲這個問題是被刪除和被添加到後退堆棧時onSavedInstanceState()永遠不會被調用。如果我不能使用onsavedInstanceState(),是否有另一種方法來解決這個問題?

回答

0

FWIW答案,我打這個爲好,但對我來說是的onSaveInstanceState正確打來電話,我在狀態數據推時被帶到了一個新的活動片段上的智能手機。和你一樣,onActivityCreated被稱爲w/savedInstanceState總是爲空。恕我直言,我認爲這是一個錯誤。

我工作圍繞它通過創建一個靜態MyApplication的狀態,並把數據存在於「全局變量」相當於...

5

我喜歡存儲查看我onCreateView返回一個全局變量,然後當我回到我簡單檢查:

if(mBaseView != null) { 
     // Remove the view from the parent 
     ((ViewGroup)mBaseView.getParent()).removeView(mBaseView); 
     // Return it 
     return mBaseView; 
    } 
+0

非常感謝:)它解決了我的問題 –

+6

不知道這是一個好主意。如果您保存對其的引用,這是否會破壞視圖以釋放內存的目的? – craigrs84

+0

我其實不確定,因爲我還沒有運行任何直接測試。但是,我的想法是這樣的。在初始化佈局中的所有元素時,將大多數元素設置爲全局變量是標準的,因此如果在上述示例中由於引用而無法回收基本View,則Android將無法回收這些視圖中的任何一個都會導致與內存相同的問題。 – AllDayAmazing

4

的問題是,該片段需要有一個Id或與它爲了使FragmentManager跟蹤其相關Tag

至少有3種方法可以做到這一點:

  1. 在XML佈局聲明Id爲您的片段:

    android:[email protected]+id/<Id> 
    
  2. 如果您的片段容器ViewId,使用FragmentTransaction

    FragmentTransaction add (int containerViewId, Fragment fragment) 
    
  3. 如果您的片段與任何View(例如,無頭片段),給它一個Tag

    FragmentTransaction add (Fragment fragment, String tag) 
    

Also, see this SO answer.