我在Android中测试片段,而且我对Fragment生命周期有一些令人困惑的行为。我有一个活动,在xml中使用横向和纵向模式的布局。我有一些代码访问在其中一个片段布局中定义的EditText对象。如果我在横向模式下启动应用程序就可以了。我访问onResume()片段方法中的组件来更新一些文本。
根据文档,当片段对用户可见时,将调用onResume()片段方法。但是,如果我旋转屏幕,即使此片段未在纵向布局中定义,也会再次调用此方法。对onCreate的这个调用会导致NullPointerException,因为这个方法引用了EditText对象。为什么onResume方法调用不属于新布局的片段?如何以及在何处修改片段中的布局数据的适当位置。我已经尝试过onStart,onResume,onActivityCreated等,但似乎都返回了相同的错误。
任何帮助都将非常感激。
答案 0 :(得分:3)
当您旋转屏幕时,Android会将片段保存在Bundle中,并在重新创建活动时重新创建它们。这就是为什么你要调用一个不存在的(实际上只是看不见的)片段。您需要在片段代码中处理这种情况,或者只是在land和port布局中包含两个片段,如果不需要,可以将片段可见性设置为GONE
。
检查片段在代码中是否可见的简单方法是:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (container == null) {
return null;
}
}
如果container
为null,则会从Bundle重新创建片段,并且不会显示(因为没有容器)。然后,您必须检查getView()
是否为空并相应地使代码短路。这可能会变得混乱,所以要注意:)