5

我有两个方向的一个布局 - 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。(此处的代码还显示了如何确定放置在容器中的片段是否不再在具有该容器的布局中运行,并避免在这种情况下创建其视图层次结构。)

4

3 回答 3

3

你可以像下面这样检查:我假设你有 Fragment1 类你通过 findFragmentById 获得的片段

Fragment1 frg1 =getFragmentManager().findFragmentById(R.id.FrgDetalleEvento);
boolean hayDetalle = ( frg1!= null && frg1.isInLayout());

解决了和我一样的问题,希望对大家有帮助

于 2015-08-31T01:26:20.487 回答
2

也许为时已晚,但我把它留给有这个问题的未来程序员,我有一个类似的问题并以这种方式解决了。

逻辑:检查屏幕方向, findViewById(R.id.fragment2)只有在屏幕处于横向模式时才调用。否则启动另一个屏幕的新意图

非工作代码;

@Override
public void onEventoSeleccionado(Evento e) {

    boolean hayDetalle = (getFragmentManager().findFragmentById(R.id.FrgDetalleEvento) != null);

            if(hayDetalle) {
                SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy hh:mm",Locale.ENGLISH);
                Log.i("EOLog", "Hay Detalle");
                ((DetalleEventoFragment)getFragmentManager().findFragmentById(R.id.FrgDetalleEvento)).mostrarDetalle(Long.toString(e.getId()),formatter.format(e.getFecha()));
            }
            else {
                Log.i("EOLog", "No hay detalle");           
                Intent i = new Intent(this,DetalleEventoActivity.class);                                        
                Bundle b = new Bundle();
                b.putLong("IDEV", e.getId());           
                b.putLong("FECHA", e.getFecha());           
                i.putExtras(b);
                startActivity(i);
            }

}

工作代码:

@Override
public void onEventoSeleccionado(Evento e) {

      int orientation = getResources().getConfiguration().orientation;

            if(orientation == Configuration.ORIENTATION_LANDSCAPE) {
                SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy hh:mm",Locale.ENGLISH);
                Log.i("EOLog", "Hay Detalle");
                ((DetalleEventoFragment)getFragmentManager().findFragmentById(R.id.FrgDetalleEvento)).mostrarDetalle(Long.toString(e.getId()),formatter.format(e.getFecha()));
            }
            else if(orientation == Configuration.ORIENTATION_PORTRAIT) {
                Log.i("EOLog", "No hay detalle");           
                Intent i = new Intent(this,DetalleEventoActivity.class);                                        
                Bundle b = new Bundle();
                b.putLong("IDEV", e.getId());           
                b.putLong("FECHA", e.getFecha());           
                i.putExtras(b);
                startActivity(i);
            }else
            {
                Log.i("EOLog", "Dispositivo erroneo");
            }

}

我希望这会有所帮助

于 2013-11-22T14:16:43.377 回答
0

请交叉检查您的活动类的 setContentView()。

我认为它应该是 setContentView(R.layout.main);

于 2013-10-23T07:01:22.540 回答