Android ListFragment不会在onSaveInstanceState()中保存包,也不会在onActivityCreated()中检索包

时间:2011-07-27 14:33:21

标签: android bundle android-3.0-honeycomb android-fragments screen-orientation

我是android的新手,我遇到了以下问题。我正在为Android 2和3开发,这就是我使用片段的原因。然而,为了使应用程序在Android 2设备上运行,我导入android.support.v4.app.ListFragment。当屏幕方向改变时,我需要在ListFragment中保持选择。我正在重写onSaveInstanceState()方法并将int放入bundle中。旋转屏幕时,将调用此方法并将int添加到包中。但是,当调用onActivityCreated()时,其bundle为null。我按照Android网站上提供的示例进行操作:http://developer.android.com/reference/android/app/Fragment.html,但如上所述 - 调用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);
    }
}

我很感激这个问题的任何帮助。

3 个答案:

答案 0 :(得分:7)

我遇到了同样的问题,将android:id添加到布局文件中的fragment元素修复了此问题。

似乎FragmentManager在重新创建片段时使用id发送相应的包。

答案 1 :(得分:3)

确保您没有在setRetainInstance(true)中致电Fragment。经过一些实验,我发现这是我的代码中的错误。必须这样做的缺点是必须手动捆绑所有实例数据。

删除方法调用并更新onSaveInstanceState以包裹所有实例变量后,我现在可以在旋转时恢复列表位置。

答案 2 :(得分:2)

我遇到了同样的问题,最终我将其跟踪到两个不同布局(纵向和横向)中的片段元素上有不同的android:id属性值。