使用兼容性库时,ListFragment的setRetainInstance方法无效

5
我试图在屏幕方向改变时保存一个ListFragment子类,因此我在onCreate函数的末尾添加了setRetainInstance(true)。我添加了一个onSaveInstanceState方法来将其所有数据添加到bundle中,然后在onActivityCreated中添加了代码以加载该数据。不幸的是,它无法正常工作。
当我使用Log.d帮助添加一些调试消息时,我发现不仅onSaveInstanceState没有被调用,而且onCreate也被调用了(文档似乎说retainInstance为true时不应该发生这种情况)。 onCreate和onActivityCreated都没有我的数据包(不足为奇)。
我猜这可能是与兼容库的问题,尽管我没有android 3.0+设备来测试这个问题。
如果需要,我可以发布一些代码片段,尽管我没有做任何复杂的操作。
更新:当我改变方向时,onDestroy没有被调用(这就是应该的),所以看起来setRetainInstance的一些部分正在工作。

1
我建议调试兼容库以查看发生了什么。您使用的兼容库版本是什么?我正在使用r1并避免使用r2,因为当替换片段时,至少存在一个回归错误,即onDestroy未被调用。 - PJL
我正在使用r3,我会寻找旧版本来看看是否有帮助。关于如何调试compat lib,您有什么建议吗?我对Java调试非常陌生。 - rofer
只需尝试并进入其中一个compat lib方法,您就应该会收到源代码位置的提示。 - PJL
花了一点时间,因为我不是用Eclipse工作的,但我已经让jdb工作了,尽管它没有太大帮助。然而,问题似乎已经自行解决了(可能是因为我添加了一些调试代码)。当我弄清楚是什么修复了它,我会发布一个答案。 - rofer
2个回答

10

我终于找出了我的问题所在。一切都归结于我忘记添加的一行代码。在我的FragmentActivity子类中,我重写了onSaveInstanceState方法,但我从未调用过super.onSaveInstanceState。显然,与我忘记调用其父类版本的其他方法不同,当我忘记调用onSaveInstanceState的父类版本时,它不会抛出运行时错误,相反,setRetainInstance功能将停止工作。我希望这能帮助有人避免像我一样经历头痛的困扰。


1
我刚遇到了同样的问题。问题在于你不必调用超类的方法,但如果你不这样做,片段将不会被保留。我不得不查看兼容性库的源代码才能弄清楚这一点。 - Malcolm
1
@rofer,您不必实现onSaveInstanceState方法才能使setRetainInstance方法起作用,对吗? - David Doria

1

当您在调用onSaveInstanceState()onActivityCreated()时将setRetainInstance=true设置为真时,看起来Bundle不会被返回。

但是,由于ListFragment正在保留,因此您可以将其状态简单地存储到字段中,并在onActivityCreated()中处理它。

请记住,Activity仍将被销毁和重新创建。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接