2012-08-14 70 views
1

我有一個片段和屏幕旋轉我想節省一些國家我安卓:捆綁總是空

@Override 
public void onSaveInstanceState(Bundle bundle) 
{ 
    super.onSaveInstanceState(bundle); 
    bundle.putSerializable("myList", myList); 
    bundle.putString("test", "test"); 
} 

救我需要的數據,我可以在代碼至少調試器看到然後得到我有的數據

@Override 
public void onActivityCreated(Bundle savedInstanceState) 
{ 
    super.onActivityCreated(savedInstanceState); 

    if(savedInstanceState != null) 
    { 
     //do something   
    } 
    else 
    { 
     //do something else 
    } 
} 

但在這裏,我總是最終我的if語句的其他布拉赫。我不知道爲什麼它是空的。謝謝。

旋轉屏幕時我在debuger此看到:

  1. 的onSaveInstanceState叫
  2. 的onCreate被稱爲

    編輯 根據第一個答案加改變了代碼 - > bundle!= null

  3. onCreate被再次調用(爲什麼?) - > bundle = null
  4. onCreateActivity被稱爲 - >束= NULL

EDIT 2 我發現關於標籤,在那裏他們得到了分離,這就是爲什麼它被稱爲兩次simlar職位。我不得不承認我還沒有完全理解這些帖子......但它可能與此有關。在我的活動我有以下代碼

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    OverviewFragment of = new OverviewFragment(); 
    FragmentTransaction tof = getFragmentManager().beginTransaction(); 

    tof.replace(R.id.frag_overview, of); 
    DetailFragmentInitial df = new DetailFragmentInitial(); 
    tof.replace(R.id.frag_details, df); 
    tof.commit(); 

} 

,並有可能改變這種莫名其妙......但我不知道......如果我只執行,如果savedInstaceState是空的片段交易,然後它似乎工作。但我不確定稍後會遇到不同的問題。有人對此有一些背景知識?

+0

什麼是「onActivityCreated」方法?我從來沒有聽說過。 – 2012-08-14 10:54:48

+0

只有你使用片段,請參閱http://developer.android.com/guide/components/fragments.html – AndyAndroid 2012-08-14 10:58:58

回答

3

爲了更好的可視性,這裏這裏是工作的解決方案@AndyAndroid(在他的評論中所述):

答案是suround我的片段中的交易編輯2 if(getFragmentManager().findFragmentByTag("overviewFrag") == null)和 課程設置標籤。


有關於同一主題的一個老問題,它可以在這裏找到:你Saving Android Activity state using Save Instance State

概述(在接受的答案)代碼之間的區別,並且該示例調用超級方法之前把它自己的值放入包中。

@jkschneider的評論概括了這一點:

請注意:您需要調用 超。onSaveInstanceState(savedInstanceState)然後將 的值添加到Bundle之前,否則它們將在該調用中被刪除(Droid X Android 2.2)。


作爲一般的建議,總是註釋與@Override -annotation覆蓋的方法,讓編譯時的安全性。欲瞭解更多信息,請參閱:When do you use Java's @Override annotation and why?


這裏有一些可能幫助更多的相關問題:

檢查上一個答案中給出的代碼是否適用於您,因爲它似乎適用於其他兩個問題的OP。

+0

感謝您的回答,但我仍然得到完全相同的行爲。 – AndyAndroid 2012-08-14 10:45:34

+0

@AndyAndroid我添加了一些參考資料,供進一步閱讀。 – 2012-08-14 11:38:32

+0

答案是在編輯2中用if(getFragmentManager()。findFragmentByTag(「overviewFrag」)== null)來完成我的片段事務,當然還要設置標記。 – AndyAndroid 2012-08-14 14:26:00