Android ListFragment不保存onSaveInstanceState()中的包/不检索onActivityCreated()中的包

我是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); } } 

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

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

似乎FragmentManager在重新创建片段时使用id来发送适当的bundle。

确保你没有在Fragment调用setRetainInstance(true) 。 经过一些实验,我发现这是我的代码中的错误。 必须以这种方式执行此操作的缺点是必须手动捆绑所有实例数据。

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

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