【问题标题】:Android ListFragment doesn't save the bundle in onSaveInstanceState()/doesn't retrieve bundle in onActivityCreated()Android ListFragment 不在 onSaveInstanceState() 中保存包/在 onActivityCreated() 中不检索包
【发布时间】:2011-07-27 14:33:21
【问题描述】:

我是 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()中的捆绑包仍然为空。

代码如下:

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

我将不胜感激任何有关此问题的帮助。

【问题讨论】:

  • onRestoreInstanceState() 不适用于片段。
  • 我唯一的建议是调试兼容源,看看你是否能掌握正在发生的事情。
  • 您可以尝试添加一个日志语句来查看是否调用了 onSaveInstanceState。我似乎遇到了同样的问题,据我所知,它甚至从未被调用过。类似 Log.d("TEST", "onSaveInstanceState called!");在你的 onSaveInstanceState 结束时应该能够告诉你它是否被调用。
  • 正如我在第一篇文章中提到的,onSavaInstanceState() 被调用,我检查了它。包裹像在希思罗机场一样丢失了:-)
  • 我使用了示例项目(HoneycombGallery),向其中添加了兼容性库,一切正常......在我的应用程序中 - 它没有。对我来说临时的解决方案是在 Manifest 中添加android:configChanges="orientation",但这并没有解决丢失捆绑包的谜团(实际上是在考虑写一本名为“丢失捆绑包之谜”的冒险书;-))。

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


【解决方案1】:

我遇到了同样的问题,在布局文件的片段元素中添加android:id 解决了这个问题。

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

【讨论】:

  • 我遇到了和 Maria 一样的问题,我在布局文件中为 fragment 元素定义了 android:id。这可能是一个兼容性库错误。
【解决方案2】:

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

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

【讨论】:

  • 如果你设置了RetainInstance(true),那么你根本不需要一个bundle... Fragment 对象永远不会被破坏,它的所有变量都保持不变。
【解决方案3】:

我遇到了同样的问题,最终我发现它是因为在两种不同布局(纵向和横向)中的片段元素上具有不同的 android:id 属性值。

【讨论】:

  • 您好,感谢您的回复。不幸的是,在我的情况下这不是同一个问题。
猜你喜欢
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
  • 2019-01-11
  • 2017-08-30
相关资源
最近更新 更多