我有两种方向的一种布局 - 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
in 景观模式。在这种情况下,
- Both
firstFragment
and secondFragment
指的是布局中的片段layout-land/main.xml
然后我将屏幕旋转到portrait模式和布局文件layout/main.xml
应该加载。在这种情况下,
-
firstFragment
指的是R.id.fragment1
-
secondFragment
指的是不存在的片段。访问其中的任何元素都会引发 NullPointerException。 (更准确地说,secondFragment
is not null
here)
这怎么办secondFragment
当布局内没有定义片段时会初始化吗?
编辑:在 Android 开发人员文档中找到的原因http://developer.android.com/training/basics/fragments/creating.html http://developer.android.com/training/basics/fragments/creating.html:
当配置更改导致托管这些活动时
片段重新启动,其新实例可能使用不同的布局
不包含与先前布局相同的片段。在这个
如果所有先前的片段仍将被实例化并且
在新实例中运行。然而,任何不再
与视图层次结构中的标签关联的不会有
他们的内容视图已创建并将从 isInLayout() 返回 false。
(这里的代码还展示了如何确定片段是否放置在
容器中不再在该容器的布局中运行
并避免在这种情况下创建其视图层次结构。)
您可以像下面这样检查:
我假设您有通过 findFragmentById 获得的片段的 Fragment1 类
Fragment1 frg1 =getFragmentManager().findFragmentById(R.id.FrgDetalleEvento);
boolean hayDetalle = ( frg1!= null && frg1.isInLayout());
解决了和我一样的问题,希望对大家有帮助
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)