屏幕旋转后,findFragmentById() 返回一个片段,即使布局内没有这样的 ID

2024-04-15

我有两种方向的一种布局 - 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(使用前将#替换为@)

屏幕旋转后,findFragmentById() 返回一个片段,即使布局内没有这样的 ID 的相关文章

随机推荐