我试图了解在导航选项卡中使用片段时如何保留片段视图状态。在我的努力中,我遇到了两个我找不到任何合适解决方案的问题。
我有两个选项卡,Tab1 和 Tab2。Tab1 的布局由 定义FragmentA
,Tab2 的布局由 定义FragmentB
。我遵循了这里给出的方法(编辑:自从提出这个问题以来,文档已经改变)。
第一个问题:即使我的视图有 ID,但在重新附加片段时(在选项卡开关旋转之后),它们的状态并没有完全恢复。特别是:EditText
带有 ID的确实会保存其输入的文本,但不会保存其启用状态。此外,即使按钮具有 ID,启用或禁用按钮也不会保存。对于这个问题,我发现了两种可能的解决方法:
- 在切换标签时使用
hide()/show()
而不是。attach()/detach()
- 在中
onPause()
,将当前片段视图状态保存在片段的View
实例变量中getView()
。onCreateView(Bundle savedInstanceState)
检查该字段是否为非空,如果是,则返回该字段的值。这个解决方案看起来很老套,有人告诉我它还可能在我的应用程序中引入内存泄漏。
第二个问题:考虑以下用户交互:用户从 Tab1 开始并进行一些更改,使 Tab1 的视图状态与其默认状态不同(我们希望片段通过 tabswitches 和设备倾斜保存此视图状态) . 用户然后转到 Tab2。然后用户倾斜她/他的设备(仍然在 Tab2)。用户然后切换到 Tab1(在新的屏幕方向)。现在,问题是:当用户最初从 Tab1 切换到 Tab2 时,片段被分离,因此它的视图被丢弃(即使片段实例仍然存在)。当用户然后倾斜设备时,活动 - 以及FragmentA
与之FragmentB
相关的活动 - 被破坏。自从FragmentA
此时不再有视图(请记住:它已分离),我们无法在调用FragmentA.onSaveInstanceState(Bundle savedInstanceState)
. 在这种情况下如何恢复片段视图状态?将每个视图元素的不同状态标志保存为 SharedPreferences 是唯一可行的解决方案吗?对于这样的“日常工作”来说,这似乎太复杂了。