gpt4 book ai didi

android-fragments - Android 导航标签 : Restoring fragment view state

转载 作者:行者123 更新时间:2023-12-04 01:08:28 25 4
gpt4 key购买 nike

我试图了解在导航选项卡中使用片段时如何保留片段 View 状态。在我的努力中,我遇到了两个无法找到任何适当解决方案的问题。

我有两个选项卡,Tab1 和 Tab2。 Tab1 的布局由 FragmentA 定义Tab2 的布局由 FragmentB 定义.
我遵循了给定的方法 here (编辑:自提出此问题以来,文档已更改)。

第一个问题:即使我的 View 有 ID,当重新附加片段时(在选项卡切换旋转之后),它们的状态也不会完全恢复。特别是:一个 EditText带有 ID 确实会保存其输入的文本,但不会保存其启用状态。此外,即使按钮具有 ID,如果它们被启用或禁用,它们也不会保存。对于这个问题,我找到了两种可能的解决方法:

  • 使用 hide()/show()而不是 attach()/detach()切换标签时。
  • onPause() , 将当前片段 View 状态保存在 View 中片段的实例变量通过 getView() .在 onCreateView(Bundle savedInstanceState)检查此字段是否为非空,如果是,则返回此字段的值。这个解决方案看起来很糟糕,我被告知它也可能在我的应用程序中引入内存泄漏。

  • 第二个问题:考虑以下用户交互:
    用户从 Tab1 开始并进行一些更改,将 Tab1 的 View 状态置于与其默认状态不同的状态(我们希望片段通过 tabswitches 和设备倾斜保存此 View 状态)。
    用户然后转到 Tab2。用户然后倾斜她/他的设备(仍然在 Tab2)。
    然后用户切换到 Tab1(在新的屏幕方向)。
    现在,问题是:当用户最初从 Tab1 交换到 Tab2 时,片段被分离,因此它的 View 被丢弃(即使片段实例仍然存在)。当用户然后倾斜设备时,事件 - 从而两者 FragmentAFragmentB与之相关- 被摧毁。自 FragmentA此时不再有 View (请记住:它已分离),我们无法在调用 FragmentA.onSaveInstanceState(Bundle savedInstanceState) 期间保存其 View 元素的状态(例如,启用/禁用哪些按钮)。 .在这种情况下如何恢复片段 View 状态?将每个 View 元素的不同状态标志保存为 SharedPreferences 的唯一可行解决方案是什么?对于这样的“日常工作”来说,这似乎太复杂了。

    最佳答案

    问题一:

    默认情况下,Android 不会保存您的 View 启用状态。似乎只保存了直接受用户操作(没有附加代码)影响的东西。对于普通 View ,no information is saved ,对于一个 TextView,EditText 是其子类,entered text is saved (如果设置了 freezesText)。

    如果你想拯救任何其他事情,你必须自己去做。 Here是一个带有一些答案的问题,展示了如何实现自定义 View 状态保存。如果您遵循这种方法,您可以坚持使用附加/分离。

    问题2:

    你是对的,在你的 View 已经被销毁后可以调用 Fragment.onSaveInstanceState(Bundle) 。但是,这不是您应该保存 View 状态的地方。当分离一个片段时,Android 会在它破坏你的 View 之前调用 View.onSaveInstanceState() 。它保存此状态并在您再次附加片段时将其返回给您。这正是您通常在不旋转的情况下在选项卡之间翻转时发生的情况。分离时不会调用 Fragment.onSaveInstanceState(Bundle)。即使您旋转设备,由于分离而保存的 View 状态将持续存在。如果您按照上面的指示实现 View.onSaveInstanceState() ,您的 View 状态将被正确保存和恢复,即使在 Tab1-Tab2-rotate-Tab1 场景中也是如此。

    旁注:
    example code当您尝试旋转时,文档中似乎有一些问题。 TabListener 的生命周期与 Activity 的生命周期相同 - 每次旋转时都会创建一个新的。这意味着每次旋转时,它也会丢失对片段的内部引用。添加的片段会自动重新创建,因此 TabListener 无需尝试创建新实例并在旋转后添加它。相反,它应该只是尝试在片段管理器中找到具有适当标签的片段,而不是内部引用。旋转后它仍然存在。

    另一个问题是选定的选项卡未保存,但在示例底部注明了这一点。您可以将其保存在 Activity.onSaveInstanceState(Bundle) 中。

    关于android-fragments - Android 导航标签 : Restoring fragment view state,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15449753/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com