在不存在的片段上调用片段生命周期和 onCreate 的问题

Posted

技术标签:

【中文标题】在不存在的片段上调用片段生命周期和 onCreate 的问题【英文标题】:Problems with Fragment lifecycle and onCreate being called on non existent fragment 【发布时间】:2011-12-23 08:54:49 【问题描述】:

我正在 android 中测试 Fragment,但我在 Fragment 生命周期中遇到了一些令人困惑的行为。我有一个在横向和纵向模式下使用 xml 布局的活动。我有一些代码可以访问在片段布局之一中定义的 EditText 对象。如果我以横向模式启动应用程序,则一切正常。我在 onResume() 片段方法中访问组件来更新一些文本。

根据文档,当片段对用户可见时,会调用 onResume() 片段方法。但是,如果我旋转屏幕,即使此片段未在纵向布局中定义,也会再次调用此方法。对 onCreate 的调用会导致 NullPointerException,因为此方法引用了 EditText 对象。为什么在不属于新布局的片段上调用 ​​onResume 方法?如何以及在哪里修改片段中的布局数据的正确位置。我尝试过 onStart、onResume、onActivityCreated 等,但似乎都返回相同的错误。

任何帮助将不胜感激。

【问题讨论】:

在不属于新布局的片段中是否也调用了 onCreateView()?如果是这样,那么您可以确定您每次都在某处实例化此片段。 【参考方案1】:

当您旋转屏幕时,Android 会将您的片段保存在一个 Bundle 中,并在重新创建 Activity 时重新创建它们。这就是为什么你会调用一个不存在的(实际上只是不可见的)片段。您需要在片段代码中处理这种情况,或者只是在陆地和端口布局中同时拥有片段,如果不需要,您可以将片段可见性设置为GONE

检查片段是否在代码中可见的简单方法是:

 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) 
        if (container == null) 
            return null;
        
  

如果container 为null,则您的片段正在从Bundle 中重新创建并且不会显示(因为没有容器)。然后,您必须检查 getView() 是否为空并相应地短路您的代码。不过这可能会变得混乱,所以要小心:)

【讨论】:

感谢您的回复,我将在今天晚些时候尝试。片段的 api 似乎与我发现我不能依赖它的文档不同步 不是不同步,只是没有触及一些关键点。阅读 Android 开发者博客上的相关博文,关注示例 cmets 以获得全貌。 谢谢。这对我来说现在可以了。我最终在 onCreateView 方法中设置了一个标志,然后在 onResume 中检查了这个标志。我仍然觉得这是一个笨拙的工作,但至少现在它正在工作。 是的,我也做过类似的解决方法。如果它工作正常,没有错误,那就去吧。

以上是关于在不存在的片段上调用片段生命周期和 onCreate 的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于Activity和Fragment生命周期的问题

活动和片段之间的生命周期

理解片段事务期间片段的生命周期方法调用

关于片段生命周期,何时调用片段的 onActivityResult?

调用 replace() 时片段的生命周期是啥?

fragment生命周期