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