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