21

Fragment縦モードではなく横モードで (ビュー付きで) 表示する必要がある UI があります。縦向きモードでも使用できるはずですが、ListPopupWindow代わりに を使用して結果が表示されます。

<fragment />フラグメントが開始されていない場合 (ポートレートの場合)、プログラムでフラグメントを作成しながら、ランドスケープ レイアウトのタグを使用することでこれを処理できると考えました。

横向きで開始する限り、これは正常に機能します。フラグメントがプログラムで作成される縦向きで開始すると、フラグメントをレイアウトにアタッチしようとするときにエミュレーターを回転させると、アプリケーションがクラッシュします。

java.lang.IllegalStateException: Fragment はビューを作成しませんでした。android.app.Activity.onCreateView(Activity.java:4095) で

のドキュメントはFragment.isInLayout()、この方法で処理できるはずであることを示唆しているようです:

タグを介してアクティビティ ビュー階層の一部としてレイアウトが含まれている場合は true を返します。これは、古いフラグメントが以前の状態から復元され、現在の状態のレイアウトに表示されない場合を除いて、タグを使用してフラグメントが作成された場合に常に当てはまります。

問題は、これを正しく行う方法、または何か不足している場合です。

アップデート:

isInLayout()現在も正常に動作していないようです。Fragment手動でコンテナーに を追加した場合は false を返します。

また、コンテナーに手動で を追加してFragmentから、そのレイアウトを含まないレイアウトに (デバイスを) ローテーションすると、クラッシュします。

原因: java.lang.IllegalArgumentException: No view found for id 0x7f060011 for fragment SearchFragment{4042f868 #2 id=0x7f060011 SearchFragment} at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:722)

4

2 に答える 2

22

これに対する答えは出ましたか?私は同様の問題を抱えていて、なんとか解決策を思いつきました。次のように、試みていることを簡単に行うことができます。

2 つの異なるレイアウトを、layout ディレクトリに 1 つ、layout-land ディレクトリに 1 つ作成します。layout-land ディレクトリにあるものは、ランドスケープ モードで使用されます。フラグメントを配置するプレースホルダーとして、s FrameLayout 要素を使用し、ID "my_fragment" を指定します。レイアウト ディレクトリのレイアウトには、その ID を持つ要素を含めないでください。

onCreate メソッドで、findViewById(R.id.my_fragment) を使用してフラグメント プレースホルダーを見つけます。存在する場合は、横向きモードであり、フラグメントを追加する必要があります (まだ存在しない場合): add(R.id.my_fragment, new MyFragment, "myFragment)。フラグメントを作成しません。

タグを使用して作成されたフラグメントを、プログラムで動的に作成したフラグメントで置き換えないように十分注意してください。isInLayout が true を返すフラグメントは、false を返すフラグメントとはまったく異なります。それらのライフサイクルはまったく異なります。1 つを別のものに置き換えると、恐ろしい IllegalStateException "フラグメントがビューを作成しませんでした" という問題が発生します。

-ブレイク

于 2011-04-06T14:53:02.680 に答える
0

問題は、使用しているフラグメントの風景レイアウトがないことが原因である可能性もあります。縦向きのものがある場合はプログラムが正常に動作しますが、デバイスを回転させると、OS はおそらく横向きフォルダーでビューを探し、ビューが見つからないため、欠落していると宣言します。フォルダ「layout」と「layout-land」の両方にビューがあることを確認してください。

于 2012-01-04T17:46:32.443 に答える