Android端末で動作するFragmentを使った画面遷移アプリを作成します。「Fragmentによる画面遷移-遷移ボタンの作成」では画面遷移アプリで使用する遷移ボタンを作成しましたが、ここではFragmentからActivityへ遷移ボタンのデータを受け渡します。
FragmentからActivityへデータ受け渡しすために、Fragmentでデータ準備ができるとActivityにイベントを発生させます。
関連するブログを次に示します。
イベントリスナーの作成
Fragmentにはデフォルトでリスナーは用意されていません。次のようにイベントリスナー「DirectionListener 」をFragmentのクラス内に内部Interfaceとして作成します。ボタンが押されるとFragment内で「onClickDirection」メソッドを呼びます。
SwFragment.java
public interface DirectionListener { public void onClickDirection(int directionId); }
イベントリスナーの登録
Fragment側「SwFragment.java」は次のようにイベントリスナーを登録します。
- 8行目で、Fragmenで上遷移ボタンがクリックされた際に、リスナーのメソッド「onClickDirection」を呼び出します。
- 用意したリスナーを使用してFragmentからActivityへコールバックを返せるように、18行目の「onAttach」メソッドと30行目の「onDettach」メソッドを使用してFragmentにActivityを登録します。
SwFragment.java
private DirectionListener mListener; @Override public void onClick(View v) { int btnId = v.getId(); if (btnId == R.id.btnup) { System.out.println("UP!"); mListener.onClickDirection(MainActivity.BTN_UP); ・・・ } } // FragmentがActivityに追加されたら呼ばれるメソッド @Override public void onAttach(Context context) { super.onAttach(context); // contextクラスがDirectionListenerを実装しているかをチェックする if (context instanceof DirectionListener) { // リスナーをここでセットするようにします mListener = (DirectionListener) context; } } // FragmentがActivityから離れたら呼ばれるメソッド @Override public void onDetach() { super.onDetach(); // 画面からFragmentが離れたあとに処理が呼ばれることを避けるためにNullで初期化しておく mListener = null; }
Activity側「MainActivity.java」は次のようにイベントリスナーを登録します。
- 1行目でインタフェース「DirectionListener 」を実装します。
- Fragmentで作成した遷移ボタンがクリックされると、クリックされた遷移ボタンの情報をパラメータにして、5行目のイベント処理「onClickDirection」に制御が移ります。
MainActivity.java
public class MainActivity extends AppCompatActivity implements SwFragment.DirectionListener { // interface内のメソッドを実装します。 @Override public void onClickDirection(int directionId) { screenfragment1 = new ScreenFragment1(); screentransaction = getSupportFragmentManager().beginTransaction(); switch (directionId) { case MainActivity.BTN_UP: ・・・