13

我是新來的android和我面臨以下問題。我正在爲Android 2和3開發,這就是我使用片段的原因。然而,爲了使應用程序在Android 2設備上工作,我導入了android.support.v4.app.ListFragment。當屏幕的方向改變時,我需要在ListFragment中保持選擇。我重寫onSaveInstanceState()方法,並將一個int放入該包中。當屏幕旋轉時,將調用此方法,並將int添加到包中。但是,當調用onActivityCreated()時,其捆綁包爲空。我遵循Android網站上提供的示例:http://developer.android.com/reference/android/app/Fragment.html,但如上所述 - 在調用onSaveInstanceState()之後,onActivityCreated()中的包仍爲空。Android的ListFragment不保存在onSaveInstanceState()中的包/不檢索包onActivityCreated()

下面的代碼:

import android.support.v4.app.ListFragment; 
public class VisitsHomeFragment extends ListFragment { 
    private int selectedPosition = -1; 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     if (savedInstanceState != null) { 
      if (savedInstanceState.containsKey("SELECTED_POSITION")) { 
       selectedPosition = savedInstanceState.getInt("SELECTED_POSITION"); 
      } 
     } 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt("SELECTED_POSITION", selectedPosition); 
    } 
} 

我很感激這個問題的任何幫助。

+0

onRestoreInstanceState()不可用於片段。 – Maria

+0

我唯一的建議是調試compat的來源,看看你是否能掌握正在發生的事情。 – PJL

+0

我玩過示例項目(HoneycombGallery),向它添加了兼容庫,並且一切正常......在我的應用程序中 - 它沒有。對我來說,臨時解決方案是在Manifest中添加'android:configChanges ='orientation'',但它並不能解決丟失的包的奧祕(實際上是想寫一本名爲「失落包的奧祕」 ;-))。 – Maria

回答

2

我有同樣的問題,我最終跟蹤到在兩個不同的佈局(縱向和橫向)上的片段元素上有不同的android:id屬性值。

+0

嗨,謝謝你的回覆。不幸的是,這不是我的情況相同的問題。 – Maria

7

我遇到了同樣的問題,將android:id添加到佈局文件中的fragment元素來解決此問題。

看起來FragmentManager在重新創建片段時使用該ID來發送適當的包。

+0

我與Maria有同樣的問題,並且我的佈局文件中的'fragment'元素定義了'android:id'。這可能是一個兼容性庫錯誤。 –

+0

對於我來說,問題出在android:id謝謝 – endryha

3

確保您沒有撥打Fragment中的setRetainInstance(true)。經過一些實驗,我確定這是我的代碼中的錯誤。不得不這樣做的缺點是必須手動綁定所有實例數據。

刪除方法調用並更新我的onSaveInstanceState以包裹所有實例變量後,我現在可以在旋轉時恢復列表位置。

+0

如果你設置了RestainInstance(true),那麼你根本不需要一個bundle ... Fragment對象永遠不會被銷燬,它的所有變量都保持不變。 – Monstieur