我有两个方向的一个布局 - 1 个横向和 1 个纵向。
/layout-land/main.xml
有两个片段:
<fragment android:id="@+id/fragment1" .. />
<fragment android:id="@+id/fragment2" .. />
/layout/main.xml
只有一个片段:
<fragment android:id="@+id/fragment1" .. />
这是MainActivity.java
:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
firstFragment = (FirstFragment) getFragmentManager().findFragmentById(R.id.fragment1);
secondFragment = (SecondFragment) getFragmentManager().findFragmentById(R.id.fragment2);
}
接下来,我开始MainActivity.java
横向模式。在这种情况下,
firstFragment
和都secondFragment
指布局中的片段layout-land/main.xml
然后我将屏幕旋转到纵向模式,layout/main.xml
应该加载布局文件。在这种情况下,
firstFragment
指的是R.id.fragment1
secondFragment
指的是不存在的片段。访问其中的任何元素都会引发 NullPointerException。(更准确地说,不在secondFragment
这里)null
secondFragment
当布局内没有定义片段时如何初始化?
编辑:在http://developer.android.com/training/basics/fragments/creating.html的 Android 开发者文档中找到的原因:
当配置更改导致托管这些片段的活动重新启动时,其新实例可能会使用不同的布局,该布局不包含与先前布局相同的片段。在这种情况下,所有先前的片段仍将被实例化并在新实例中运行。但是,任何不再与视图层次结构中的标记关联的内容都不会创建其内容视图,并且将从 isInLayout() 返回 false。(此处的代码还显示了如何确定放置在容器中的片段是否不再在具有该容器的布局中运行,并避免在这种情况下创建其视图层次结构。)