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

发布于 2022-09-01 20:52:40 字数 161 浏览 12 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

背叛残局 2022-09-08 20:52:41

你看这篇文章里总结的方法可以解决你的问题吗?
如何在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的方法(题主的情况)。所以要看情况而定。

毅然前行 2022-09-08 20:52:41

如果重新启动你的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进行恢复

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文