当Android旋转屏幕导致横竖屏切换时,如何保存当前Fragment的实例并在Activity销毁重建后还原状态?

我在一个Activity里用了四个Fragment,四个Fragment是顺序使用的,当第一个结束后替换为第二个,以此类推。
当手机进行横竖屏切换的时候,不管现在处于第几个Fragment,都会重新加载第一个。有什么方法可以保存当前Fragment的实例呢, 并且在Activity销毁重建后还原状态。

阅读 17.3k
2 个回答

你看这篇文章里总结的方法可以解决你的问题吗?
如何在Android设备旋转时暂存数据以保护当前的交互状态 一文中总结了以下几种情况:

  • 设备旋转时保存Activity的交互状态: onSaveInstanceState();

  • 设备旋转时保存Fragment的交互状态: setRetainInstance(true);

  • 设备旋转时保存WebView的数据: android:configChanges="keyboardHidden|orientation|screenSize";

  • 设备旋转时保存在自定义View中绘制的图形。

如果Fragment不包含WebView,只是简单的UI View,像是TextView, Button, CheckBox, ImageView... 不建议使用setRetainInstance方法,只需要记住当前fragment的index,然后在设备旋转后根据数据重新实例化一个fragment。因为不包含大量数据,旋转的过程中几乎可以用“无缝切换”来形容。
如果包含WebView还是采用针对WebView的方法(题主的情况)。所以要看情况而定。

如果重新启动你的Activity需要恢复大量的数据,重新建立网络连接,或者执行其他的密集型操作,这样因为配置发生变化而完全重新启动可能会是一个慢的用户体验。并且,使用系统提供的onSaveIntanceState()的回调中,使用Bundle来完全恢复你Activity的状态是可能是不现实的(Bundle不是设计用来携带大量数据的(例如bitmap),并且Bundle中的数据必须能够被序列化和反序列化),这样会消耗大量的内存和导致配置变化缓慢。在这样的情况下,当你的Activity因为配置发生改变而重启,你可以通过保持一个Fragment来缓解重新启动带来的负担。这个Fragment可以包含你想要保持的有状态的对象的引用。

当Android系统因为配置变化关闭你的Activity的时候,你的Activity中被标识保持的fragments不会被销毁。你可以在你的Activity中添加这样的fragements来保存有状态的对象。

在运行时配置发生变化时,在Fragment中保存有状态的对象
a) 继承Fragment,声明引用指向你的有状态的对象
b) 当Fragment创建时调用setRetainInstance(boolean)
c) 把Fragment实例添加到Activity中
d) 当Activity重新启动后,使用FragmentManager对Fragment进行恢复

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏