Android:フラグメント間のジャンプの正しい方法
-
27-10-2019 - |
質問
これは、技術的な質問ではなく、デザインの質問です。
一般的なケース: :アクティビティ全体の変更を加えるために、フラグメントのUIイベントが必要です。
特定のケース: :同じアクティビティでホストされている2つのフラグメントがあります。ユーザーがそれらのフラグメントのいずれかでボタンをクリックすると、他の断片に置き換えたいと思います。
私 欲しくない, しかし、私の断片は私の活動に触れています。動作を後で変更したいと思うかもしれません(おそらく、より大きな画面で、最初の画面を置き換える代わりに両方のフラグメントを表示します)、そして私のフラグメントコードにそのロジックがあることを望まないかもしれません。
私がしたことは実装でした Listener
私のフラグメントのクラス、それはイベントをに報告します Activity
. 。これにより、別のものを使用したい場合 Activity
異なるディスプレイの動作があるクラスでは、リスナーを変更して、 Fragment
コードは触れられません。
これはそれをやり遂げる良い方法ですか?標準的な良い練習、またはより良いデザインパターンはありますか?
解決
リスナーを使用することは、フラグメントとアクティビティの間で通信する推奨方法です。
これを参照してください Android Documentatinセクション 侵入用。長い話の要するに、彼らはアクティビティクラスによってリスナーインターフェイスを実装し、getActivity()をキャストするだけで、リスナーに断片が生じます。
私の個人的な経験から、これは非常に便利です。
- Easilly Switchの基礎となるアクティビティ(3.0以前の互換性のためのラッパーアクティビティでフラグメント全体をホストし、このフラグメントを11+で他の人と一緒にホストします)
- ラッパーアクティビティがコールバックをサポートしているかどうかは、Easillyコントロール。チェックするだけで、リスナーを実装し、そうでない場合はアプリ固有のアクションを実行します。
他のヒント
リスナーを使用することについて正しいです。これは私が職場のプロジェクトでも対処しなければならなかったものです。それを処理する最良の方法は、自然の中でフラグメントをスタンドアロンにすることです。フラグメントと対話したいものはすべて、特定のイベントにパブリックAPIおよび/またはリスナーを設定する必要があります。あなたが精通しているなら デザインパターン, 、 これは オブザーバーパターン. 。イベントは、一般的または特定のものであり、データまたはデータが含まれている場合があります。
私のプロジェクトの例として、私には2つの断片がありました。選択したリスト項目を表示したリストフラグメントとインフォラグメント。 ListFragmentには、私のアクティビティがフックするためのリスナーインターフェイスが既にありますが、Infofragmentは基本的なフラグメント以来ではありません。フラグメントが閉じたいときに通知されるリスナーインターフェイスをインフォラグメントに追加しました。フラグメントの場合、これはボタンプレスまたは特定のアクションが発生する可能性がありますが、私のアクティビティに関する限り、イベントがトリガーされると、フラグメントビューが閉じます。
フラグメントに多くのリスナーを使用することを恐れないでください。また、データパラメーターを使用してそれらを個別化する特定のアクションでそれらをグループ化しようとします。お役に立てれば!
技術的な答え:
同じアクティビティでホストされている2つのフラグメントがあります。ユーザーがそれらのフラグメントのいずれかでボタンをクリックすると、他の断片に置き換えたいと思います。
FragmentTransaction ft = this.getFragmentManager().beginTransaction();
Fragment mFragment = Fragment.instantiate(this.Activity(), Fragment2.class.getName());
ft.replace(android.R.id.content, mFragment);
ft.commit();
public class Example_3_Mainfile extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.example_3_mainfile);
Fragment fr ;//make class that extend to thefragment
fr = new Act_2_1();
FragmentManager fm = getFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.replace(R.id.fragment_place, fr);
//id get of fragment tag from xml file there decelar
fragmentTransaction.commit();
}
}