【问题标题】:How to prevent the call of oncreate() and oncreateView() to occur TWICE when fragment is rotated?如何防止在片段旋转时调用 oncreate() 和 oncreateView() 两次?
【发布时间】:2014-04-26 22:19:07
【问题描述】:

我正在将对象保存在 onsaveInstance() 中,但是在片段旋转之后,我在 oncreate() 中获取了保存的对象,第二次调用方法 oncreate(Bundle onsaveInstance) 并且那次 onsaveInstance 变为 null。如何解决问题或防止 oncreate() 方法的调用发生两次?

【问题讨论】:

    标签: android rotation fragment


    【解决方案1】:

    也许在片段的 onCreate() 回调方法中使用 setRetainInstance(true) 会有所帮助:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);    
    }
    

    如果设置为“true”,当方向改变时,片段实例不会被破坏(只有它的视图层次结构被破坏),它会从 onDestroyView() 传递到 onDetach()(跳过 onDestroy()),当 Activity 被完成的。并且当方向更改完成并创建新的 Activity 时,会调用 onAttach(),跳过 onCreate(),并调用 onCreateView()。这样,Fragment 就会保持其状态。

    为了更好地理解保存和检索片段状态的不同方法,我建议你阅读这个 --> saving-and-retrieving-android-instance-state-part-2/ 第 1 部分是关于活动的,第 2 部分是关于片段的。

    【讨论】:

    • 谢谢。我试了一下,但它没有帮助,即使在这种情况下,oncerate() 方法调用了两次。
    • 在使用onSaveInstanceState()时,正常的做法是检查bundle是否为空,然后恢复数据。类似这样的“public void onCreate(BundleavedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState != null) { // 恢复数据。如果有一个保存状态。}}”。我不知道你为什么说 onCreate() 被调用了两次。也许如果你发布你的代码或日志
    猜你喜欢
    • 2013-03-09
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多