今日はFragmentの制御について、Viewの切り替えやページの置換などの操作を中心に説明します。 Fragmentの管理オブジェクトの取得方法やActivityとの通信方法などもあります。
1. フラグメントの管理
アクティビティ内のフラグメントを管理するには、FragmentManager を使用して、アクティビティの getFragmentManager() を呼び出してそのインスタンスを取得する必要があります。
•FragmentManager を通じて次のようないくつかの操作を実行できます。 findFragmentById() を使用します。アクティビティ レイアウトで UI フラグメントを提供する) または findFragmentByTag() (UI の有無にかかわらずフラグメントに適用可能) で使用され、アクティビティ内に存在するフラグメントを取得します。
•popBackStack() を使用してバックスタックからフラグメントをポップします (ユーザーが BACK コマンドを押すことをシミュレートします)。
•addOnBackStackChangeListener() を使用して、バックスタック内の変更のリスナーを登録します。
2. フラグメント トランザクションの処理
アクティビティでフラグメントを使用する非常に強力な機能は、ユーザーの操作に基づいてフラグメントに対して追加、削除、置換、およびその他のアクションを実行することです。アクティビティに送信された変更の各セットはトランザクションと呼ばれ、FragmentTransaction の API を使用して処理できます。各トランザクションをアクティビティ管理のバックスタックに保存することもでき、ユーザーは (アクティビティ内を戻るのと同様に) フラグメント内の変更を元にナビゲートできるようになります。
FragmentManager から FragmentTransaction インスタンスを取得します:
FragmentManager fragmentManager =getFragmentManager(); FragmentTransaction fragmentTransaction =fragmentManager.beginTransaction();
各トランザクションは、同時に実行される変更のセットです。 add()、remove()、replace() などのメソッドを使用して、特定のトランザクション内で実行するすべての変更を設定できます。次に、トランザクションをアクティビティに適用するには、commit() を呼び出す必要があります。
commit() を呼び出す前に、addToBackStack() を呼び出して、フラグメント トランザクションのバックスタックにトランザクションを追加することもできます。このバック スタックはアクティビティによって管理され、ユーザーが [BACK] ボタンを押すことで前のフラグメントの状態に戻ることができます。
//创建修改实例 Fragment newFragment = newExampleFragment(); FragmentTransaction transaction =getFragmentManager().beginTransaction(); // Replace whatever is in thefragment_container view with this fragment, // and add the transaction to the backstack transaction.replace(R.id.fragment_container,newFragment); transaction.addToBackStack(null); //提交修改 transaction.commit();
上記は、あるフラグメントを別のフラグメントに置き換え、以前の状態をバックスタックに保持する方法です。この例では、newFragment は、現在のレイアウト コンテナー内の R.id.fragment_container によって識別されるフラグメントを置き換えます。 addToBackStack() を呼び出すと、置換トランザクションがバック スタックに保存されるため、ユーザーはトランザクションをロールバックし、BACK ボタンを押して前のフラグメントを戻すことができます。
トランザクションに複数の変更を追加し(add()やremove()など)、addToBackStack()を呼び出すと、commit()を呼び出す前に適用されたすべての変更が単一のトランザクションとしてバックグラウンドに追加されます。スタック、BACK キーを押すと、それらを一緒に戻します。 FragmentTransaction に変更を追加する順序は、次の例外を除いて重要ではありません:
• Commit() は最後に呼び出す必要があります
• 複数のフラグメントが同じコンテナに追加される場合、追加される順序によって、ビュー階層に表示される順序
フラグメントを削除するトランザクションを実行するときに、addToBackStack() が呼び出されないと、そのフラグメントはトランザクションのコミット時に破棄され、ユーザーは元のページに戻ることができなくなります。それ。このため、フラグメントを削除するときに addToBackStack() を呼び出すとフラグメントは停止され、ユーザーが戻るとフラグメントが再開されます。さらに、各フラグメント トランザクションに対して、トランザクションをコミットする前に setTransition() を呼び出すことでトランザクション アニメーションを適用できます。
commit() を呼び出しても、トランザクションはすぐには実行されません。逆に、トランザクションをスケジュールし、準備が完了すると、アクティビティの UI スレッド (メイン スレッド) で実行します。ただし、必要に応じて、UI スレッドからexecutePendingTransactions() を呼び出して、commit() によって送信されたトランザクションを即座に実行できます。ただし、トランザクションが別のスレッドのタスクのスレーブでない限り、これは通常必要ありません。
警告: commit() を使用してトランザクションをコミットできるのは、アクティビティがその状態を保存する前 (ユーザーがアクティビティを終了するとき) です。
3. アクティビティと通信します
フラグメントはアクティビティから独立したオブジェクトとして実装されており、アクティビティ内で複数で使用されますが、特定のフラグメント インスタンスは、それを含むアクティビティに直接バインドされます。 特別なフラグメントは、getActivity() を使用してアクティビティ インスタンスにアクセスし、アクティビティ レイアウト内のビューの検索などのタスクを簡単に実行できます。次のコードのように:
View listView =getActivity().findViewById(R.id.list);
同様に、アクティビティは、findFragmentById() または findFragmentByTag() を使用して FragmentManager から Fragment への参照を取得することで、フラグメント内のメソッドを呼び出すことができます。
ExampleFragment fragment =(ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
4. 概要
最後に、Fragment の例についてお話します。Android 関係者は、Fragment のさまざまな使用例を提供しています。この API デモには、Fragment の使用例が含まれています。周りを見回さずに API デモ プログラムを見るだけで済みます。さまざまな機能が分離され、さまざまなクラスが実装されます。必要に応じて特定のコードを表示できます。