0

私のアクティビティには、縦向きと横向きの 2 つの異なる xml レイアウトがあります。Activity の onCreate() でそのコードを使用して、向きが変わるときに同じフラグメントを使用しようとしています:

if (savedInstanceState == null) {
    frag = Fragment
        .instantiate(this, PlayerControlsFragment.class.getName());
} else {
    frag = fragmentManager.findFragmentByTag(FRAG_TAG);
}

次に、方向に応じて:

private void initLandscapePlayerFragment(FragmentTransaction ft) {
    ft.add(R.id.layout_center_top, frag);
}
private void initPortraitPlayerFragment(FragmentTransaction ft) {
    ft.add(R.id.layout_left_top, frag);
}

そしてそれは私に素敵な

IllegalStateException: フラグメント Frag のコンテナー ID を変更できません

実際、両方のxmlで同じコンテナIDを使用すると機能しますが、私の場合は解決策ではありません. さまざまなランダムな解決策(アクティビティを破棄する前にデタッチするなど)を試しましたが、成功しませんでした..
何か考えはありますか?

4

3 に答える 3

0

読んでいる他の人のために。私たちがやろうとしていることを理解してください。単純に画面の回転を処理しているわけではありません。画面の回転とレイアウトの変更後にフラグメントを再接続しようとしています。

Android は、同じ ID を持つコンテナーにフラグメントをアタッチし直さないことに関するエラーをスローします。問題は、レイアウトの変更でコンテナが存在しないことです。具体的には新しいコンテナにアタッチしたいのです (複数のパネルを持つ異なるレイアウト、つまりランドスケープであるため)。

私はおそらくあなたと同じくらいイライラしています。あなたの答えには解決策がないことがわかりました。私が知る限り、それは不可能です。UI フラグメントに RetainInstance(true) を設定し、画面の回転後に再アタッチすることはできません。とにかく、少なくともサポートライブラリを使用しないでください(ネイティブサポートが機能する可能性があります。わかりません/無関係です)。

最後に、フラグメントをダンプして最初から再作成することを許可します。

バックスタックがまだあるので、面倒かもしれません..

私は電話しなければなりませんでした

super.onCreate(null)

フラグメント トランザクション バックスタックをダンプします。

次に、onSaveStateInsance のバンドル内の独自の情報を使用して、レイアウト変更に対するユーザーの期待に沿って画面を再作成します (2 つのフラグメントのどちらが画面全体を占めるようになります)。

動作は非常にアプリケーション固有のものでした...それがあなたにどのように適用されるかを詳しく説明したり議論したりできてうれしいですが、基本的に繰り返しますが、すべてをダンプし、ユーザーの期待に合わせてゼロから再作成する必要がありました. 実際、android は、クラッシュするだけのバックスタックで邪魔になり、バックスタックを強制終了する方法はありませんが、super.oncreate 呼び出しに null を渡します。

于 2013-05-29T11:37:28.283 に答える
-2

複数の画面のサポートに関する設計ドキュメント(#Using configuration qualifiers)を読むことから、デバイスの向きに応じてビューを膨張させるために使用されるレイアウトを制御するべきではありません。正しいアプローチは、横向きバージョンのビューを \*-land リソース フォルダーに追加することです。どのリソースが選択されているかの制御を Android に渡し、プライベートな init メソッドを削除して、コードを簡素化します。あなたはまだ同じ問題を抱えていますか?

于 2012-05-28T15:41:20.760 に答える