2011-11-07 51 views
2

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

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

任何帮助将不胜感激。

+0

是否onCreateView()也称为片段不是新布局的一部分?如果是这样,那么你可以确定你每次都在某个地方实例化这个片段。 –

回答

2

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

一个简单的方法来检查,如果这个片段中可见的代码是这样的:

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

如果container为空,正在从一个包重新创建你的片段将不会显示(因为没有容器)。然后您必须检查getView()是否为空并相应地短路您的代码。这可能会变得凌乱,但要小心:)

+0

谢谢你的回应,我会在今天晚些时候尝试。碎片api似乎与我发现的文档不同步,我只是不能依靠它 –

+0

它不是不同步,只是没有触及一些关键点。阅读Android开发者博客上的相关博客条目,并注意示例注释以获得完整图片。 –

+1

谢谢。现在这对我来说工作正常。我最终在onCreateView方法中设置了一个标志,然后在onResume中检查了这个标志。我仍然觉得这是一个笨拙的工作,但现在至少在工作。 –

相关问题