在方向更改时保存UI - 如果保留Fragment,则onSaveInstanceState无法按预期工作

PJL*_*PJL 18 android android-fragments

使用compat lib v1(因为某些错误而不使用v2 | 3); 这个问题的一个变种.

我有一个片段,其UI具有各种控件,我希望在方向更改时保持其状态.

父方活动在方向改变时被销毁(请不要告诉我有关清单变化以避免活动娱乐!!!!).

片段调用setRetainInstance(true).

1)现在我的理解是,具有唯一ID的视图应该保留一些状态,例如方向更改.鉴于此,我期望一个非null的bundle,onCreateView|onActivityCreated但它是null.

2)在任何情况下如果我保存状态onSaveInstanceState(确保我调用super)我仍然在'onCreateView | onActivityCreated'中得到一个空包

3)如果我不调用setRetainInstance(true)那么onCreateView|onActivityCreated即使我没有`onSaveInstanceState'方法,我也会得到一个非空包.

我的问题是,这是否按预期工作,我对生命周期的理解被打破了?无论如何,我猜测对我来说最好的方法是保留片段,然后在片段中保持控件的状态.

提前致谢.彼得.

Cat*_*san 17

如果您使用setRetainInstance(true)当然捆绑包为空.该片段不会被销毁,只会从当前活动中分离并附加到新活动.只有当片段被销毁时,才会获得包含您保存的值的包onSaveInstanceState.只需删除setRetainInstance(true)并使用onCreateView()中保存的值来设置自定义视图.

  • 谢谢,我意识到`onCreateView`无论如何被调用,我自己管理控件的状态.我也很欣赏事情基本上按照预期工作,但是,我仍然感到惊讶的是,在旋转时调用`onSaveInstanceState`,这给我的假象是"onCreateView"随后会被一个非null的bundle调用. (7认同)
  • 无论是否使用setRetainInstance,都会调用onCreateView().因此,将重新创建整个视图.您实际上看到哪些控件丢失状态?setRetainInstance(true)只应在非常特定的情况下使用.你到底想要完成什么?setRetain ..不保持控件的状态,但保持该片段处于活动状态,以便您可以在成员变量中保存各种信息.然后,当再次调用onCreateView时,您可以使用成员变量中的信息设置各种视图的状态. (5认同)
  • 然后我很惊讶当调用`setRetainInstance(true)`时,我在旋转时调用`onSaveInstanceState`,此外控件的状态丢失了.我的理解是,具有唯一ID的视图应该保留一些状态,例如方向更改. (2认同)