android - 调用分离后保存 fragment UI 状态

标签 android user-interface fragment lifecycle

我正在使用 ActionBar 中的选项卡来处理 UI。在选项卡之间切换时,我目前正在我的 Activity 中管理选项卡单击事件,并根据需要使用 FragmentManager 调用附加和分离。

每次附加一个 fragment 时,我都会经历整个生命周期并创建一个新 View 并重新加载我的所有数据。我在 onSaveInstanceState 和 onActivityCreated 中使用给定的 Bundle 来更新 gui 元素(主要是列表的滚动位置)。

这工作正常,但有很多开销。在我的例子中,列表可能有 300 条左右的记录,并且在选项卡之间切换时有明显的延迟。

为了加快速度,我现在将 onCreateView 中的 Root View 保存为类变量。然后,当由于附加 fragment 而再次调用 onCreateView 时,我测试了我的 Root View 的非空值并返回它,而不是重新膨胀 View 。这个保存的 View 仍然有适当的数据集,在这种情况下我也绕过了加载数据。当然,如果 Fragment 在后台被操作系统破坏,我仍然需要完全重建 View 和数据。

我的问题是这是否是一种有效的方法?除非有内存问题需要担心,否则我认为它没有缺点。

最佳答案

这不是最好的方法,原因如下:

当您首先创建 Root View 时,所有 View 都会使用 Activity 的上下文进行扩充。如果此 Activity 被销毁,然后您尝试将 Fragment 重新附加到此 Activity 的新实例,您将遇到问题。

其次,在不使用时将完全膨胀的 Root View 放在周围是一种可怕的内存使用。现在,您提到的记录未存储在任何 View 中,而是您的 ListView 引用了您创建的适配器,该适配器将与您的 View 一起保存在内存中。这是大量的数据,只是坐在那里。

现在要正确地给你一个建议,你最终必须在内存使用和性能之间划清界限,记住如果你打算公开这个应用程序,有很多劣质硬件设备。

一个选项是您已经完成的,即在分离时使用 savedInstanceState 变量。您可以尝试将您的 300 条记录放入此 Bundle 中,然后查看其执行情况。如果数据是您创建的类,实现 Parcelable 接口(interface)(请参阅 documentation 了解如何正确实现它)并将其存储在 Bundle 中,然后稍后检索它并创建一个新的适配器。我强烈建议不要在附件之间保留对 View 的引用。

关于android - 调用分离后保存 fragment UI 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10160006/

相关文章:

java - 我希望先删除按钮,然后执行函数 cam() 中的内容

使用非常小的代码时,Java-Image 不会绘制到屏幕上

android - 如何在按下单个 fragment 的手动后退按钮时返回上一个 fragment ?

android - 在哪里可以找到 FragmentTabHost 库

android - 可以在 ListFragment 上以编程方式添加 ImageView 吗?

android - 不满意链接错误 : dlopen failed: cannot locate symbol "__aeabi_memcpy4" referenced by

android - 将对象写入 android 中的内部存储(在新目录中)

android - 在android中使用AESCrypt加密和解密

android - 如何禁用 Kotlin 中的某些 PopupMenu 项?

java - 为 Java 软件制作漂亮的 GUI 的最佳方法是什么