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:
・・・