背景:
我有一个 main Activity
,它包装了一个Fragment
可以更改的 main ,为了保留一个 backstack 我使用FragmentManager
's backstack。
与保留活动堆栈的主要区别在于,当片段被推送到后台堆栈并被替换时,它将调用它onDestroyView()
而不是它onDestroy()
,当它返回时,它将重新创建它的视图onCreateView()
。(但是onCreate()
不被调用,因为片段对象没有被释放)
在活动堆栈中它不会发生并且视图仍然存在。
这对低端设备有积极影响,因为 Android 操作系统可以释放一些内存并且您不必保持视图正确(在我的应用程序中来自服务器的消息可能会随时更改视图)因此可以节省宝贵的带宽也是如此。
实际问题:
假设我有一个片段,用户点击某物,它的视图发生了变化,例如展开了一个列表。
如果用户随后转到另一个屏幕(即片段),则前一个片段将被推送到后台堆栈,并且它的视图将被销毁。
当用户返回时,片段将被重新创建,并且不会“记住”用户所做的更改,例如列表不会按应有的方式扩展
那么如何在不为每个视图制作特殊情况的情况下保存状态并恢复它呢?
不受欢迎的答案:
- 保持视图活着:做一些事情来保持视图会破坏片段效率
- using
onSaveInstanceState()
:当片段被推送到后台堆栈时,它不会被调用,因为活动没有被破坏并且这不是配置更改。 - 特殊对象:如果系统有办法为您做,请不要做。