横向きと縦向きの 2 つの方向に 1 つのレイアウトがあります。
/layout-land/main.xml
2 つのフラグメントがあります。
<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
ます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 Developer Documentation にある理由:
構成の変更により、これらのフラグメントをホストするアクティビティが再開されると、その新しいインスタンスは、以前のレイアウトと同じフラグメントを含まない別のレイアウトを使用する場合があります。この場合、以前のフラグメントはすべてインスタンス化され、新しいインスタンスで実行されます。ただし、ビュー階層内のタグに関連付けられなくなったコンテンツ ビューは作成されず、isInLayout() から false が返されます。(ここのコードは、コンテナに配置されたフラグメントがそのコンテナのレイアウトで実行されなくなったかどうかを判断し、その場合にそのビュー階層を作成しないようにする方法も示しています。)