5

横向きと縦向きの 2 つの方向に 1 つのレイアウトがあります。

/layout-land/main.xml2 つのフラグメントがあります。

  • <fragment android:id="@+id/fragment1" .. />
  • <fragment android:id="@+id/fragment2" .. />

/layout/main.xmlフラグメントは 1 つだけです:

  • <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ますsecondFragmentlayout-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 Developer Documentation にある理由:

構成の変更により、これらのフラグメントをホストするアクティビティが再開されると、その新しいインスタンスは、以前のレイアウトと同じフラグメントを含まない別のレイアウトを使用する場合があります。この場合、以前のフラグメントはすべてインスタンス化され、新しいインスタンスで実行されます。ただし、ビュー階層内のタグに関連付けられなくなったコンテンツ ビューは作成されず、isInLayout() から false が返されます。(ここのコードは、コンテナに配置されたフラグメントがそのコンテナのレイアウトで実行されなくなったかどうかを判断し、その場合にそのビュー階層を作成しないようにする方法も示しています。)

4

3 に答える 3

3

以下のように確認できます: findFragmentById で取得したフラグメントの Fragment1 クラスがあると仮定します

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 に答える