4

Fragments を使用して、アプリケーションのさまざまなビューを表しています。ビュー間を移動するときに、次のコードを使用してフラグメントを置き換えます。

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right);
ft.replace(R.id.main_linearlayout_fragmentcont, frag);
ft.addToBackStack(null);
ft.commit();

回転時に多くの問題が発生し、アクティビティが再構築されました。Android の古いバージョンをサポートする必要があるため、 android:configChanges="orientation" はオプションではありません。多くの問題は、Android が Fragment 状態を保存する方法の性質によるものです。

これらは私が遭遇している問題です:

1) Fragment トランジションは、回転後に自動的に復元されるポップ イベントのカスタム アニメーションを記憶しません。しかし、彼らは私の BackStack を覚えています。アニメーションを使用して置換を行い、ポップをすべて一緒に取り除く独自のバックハンドラーを作成できることはわかっていますが、 popBackStack() を呼び出す前にアニメーションをリセットする方法、または FragmentManager に記憶させる方法があるかどうか疑問に思っていました回転後に自動復帰するときのアニメーション。

2) 私が抱えているもう 1 つの問題は、独自のフラグメントを含む最上位のフラグメント ビューの 1 つに、多数の子ビュー (linearlayouts) があることです。これらの子ビューは、プログラムによって作成および設定されます。ローテーション後にフラグメントが再作成されると、フラグメント オブジェクトの onCreateView で子ビューをプログラムで再構築し、各子ビューの下にフラグメントが重複してしまいます (1 - プログラムで作成し、1 - Android フラグメントが復元から作成されます)。これは、回転後に同じIDで子ビューをプログラムで再構築したためだと思います。フラグメントが復元されないようにする方法はありますか? Android はいつ、savedState の Fragments を私がプログラムで作成したこれらのビューに挿入しますか? これを防ぐにはどうすればよいですか?

3) 上記の置換コードは、frag (フラグメント) オブジェクトに対して onCreateView を複数回起動するようです。これはローテーションなしで、上記のコードを 1 回だけ実行すると発生します。上記のコードで Fragment の onCreateView が複数回呼び出される理由はありますか?

フラグメントに関する質問: 1) アクティビティの再構築時に Android がフラグメントを自動復元しないようにすることはできますか? これについてどうすればいいですか?LinearLayout の ID に基づいていますか? フラグメント onStop を含む LinearLayout の removeAllViews を呼び出すことができますか? そうすれば、保存時にビューは存在しませんか?

2) 参照はあるが ID を持たない LinearLayout に Fragment を追加する方法はありますか? フラグメントの追加、置換 API には int ID が必要なようです。

ありがとう!

4

2 に答える 2

3

1) もしあなたが私に知らせる方法を見つけたら、私もそれで腹が立ちます

2) おそらくadd最上位フラグメント内の FragmentTransaction を呼び出していますが、復元操作も追加されているため、重複しています! オプション 1。replace代わりに使用します。オプション 2. (推奨) チェックif(savedInstances==null) { // do transaction } else { //let the system rebuilt it itself}

3) フラグメントの一部であるビューのレイアウトを (add または replace を呼び出して) 変更する場合、マネージャーはメソッドを呼び出してビューを再度作成します。それがバグなのか機能なのか、機能なのかどうかはまだわかりません。わかったら教えて

1) (おそらく 4 ですよね?) レイアウトをいじらないでください。削除したい場合は、 を使用して削除してwhile(popBackStackImmediatly){}ください。自動的に行います。

2)(5であると思われますか?)参照がある場合は、ID View.getId()を持っています

ハッピーコーディング!

于 2013-01-10T17:55:28.460 に答える
0

デバイスの向きを変更する場合は、アクティビティの検証を確認し、スタックでフラグメントを管理して、その場合にフローが損傷しないようにします。

if(savedInstanceState == null) {

   mFragmentManager = getSupportFragmentManager();
   FragmentTransaction fragmentTransaction = 

   mFragmentManager.beginTransaction();

   FragmentOne fragment = new FragmentOne();

   fragmentTransaction.add(R.id.fragment_container, fragment);
   fragmentTransaction.commit();
}
于 2016-01-02T08:47:49.560 に答える