我是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);
}
}
我很感激这个问题的任何帮助。
答案 0 :(得分:7)
我遇到了同样的问题,将android:id
添加到布局文件中的fragment元素修复了此问题。
似乎FragmentManager
在重新创建片段时使用id发送相应的包。
答案 1 :(得分:3)
确保您没有在setRetainInstance(true)
中致电Fragment
。经过一些实验,我发现这是我的代码中的错误。必须这样做的缺点是必须手动捆绑所有实例数据。
删除方法调用并更新onSaveInstanceState
以包裹所有实例变量后,我现在可以在旋转时恢复列表位置。
答案 2 :(得分:2)
我遇到了同样的问题,最终我将其跟踪到两个不同布局(纵向和横向)中的片段元素上有不同的android:id属性值。