Android 開発 : DialogFragmentでコールバック。 呼び出し元ごとに処理を変えたい場合。

Pocket

Androidアプリ開発で、DialogFragmentで作成したダイアログからコールバックを受ける方法です。

callbackメソッドを用意する方法を良くネットで見かけるのですが、
一つのアクティビティ内から複数回呼び出して、呼び出し元ごとに処理を変えたい場合の方法です。

ネットワークエラーのダイアログのような実装を想定しています。

ちょっと、DialogFragmentが使いにくいのですが、現状これがベターと判断しました。

MainActivity.java


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

/* 〜略〜 */

// trigger button
Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SampleDialogFragment fragment = new SampleDialogFragment();
fragment.setTargetFragment(null, CommonConst.REQUEST1);
fragment.show(getFragmentManager(), "dialog");
}
});

Button button2 = (Button)findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SampleDialogFragment fragment = new SampleDialogFragment();
fragment.setTargetFragment(null, CommonConst.REQUEST2);
fragment.show(getFragmentManager(), "dialog");
}
});

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// request1
if(requestCode == CommonConst.REQUEST1 && resultCode == Activity.RESULT_OK) {
Log.d("1 OK", Integer.toString(requestCode));
}
else if(requestCode == CommonConst.REQUEST1 && resultCode == Activity.RESULT_CANCELED) {
Log.d("1 CANCELED", Integer.toString(requestCode));
}

// request2
else if(requestCode == CommonConst.REQUEST2 && resultCode == Activity.RESULT_OK) {
Log.d("2 OK", Integer.toString(requestCode));
}
else if(requestCode == CommonConst.REQUEST2 && resultCode == Activity.RESULT_CANCELED) {
Log.d("2 CANCELED", Integer.toString(requestCode));
}
}

SampleDialogFragment.java

public Dialog onCreateDialog(Bundle savedInstanceState) {

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

        builder.setMessage("test message")

        .setPositiveButton("OK", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int id) {
                Intent result = new Intent();
                if (getTargetFragment() != null) {
                    // Fragmentからの呼び出しの場合
                    getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, result);

                } else {

                    // Activityからの呼び出しの場合
                    PendingIntent pi = getActivity().createPendingResult(getTargetRequestCode(), result, PendingIntent.FLAG_ONE_SHOT);

                    try {
                        pi.send(Activity.RESULT_OK);
                    } catch (PendingIntent.CanceledException ex) {
                        ex.printStackTrace();
                    }

                }

            }

        })

        .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int id) {

                Intent result = new Intent();

                if (getTargetFragment() != null) {

                    // If the caller is in Fragment.

                    getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_CANCELED, result);

                } else {
                    // Fragmentからの呼び出しの場合
                    PendingIntent pi = getActivity().createPendingResult(getTargetRequestCode(), result, PendingIntent.FLAG_ONE_SHOT);

                    try {
                        pi.send(Activity.RESULT_CANCELED);
                    } catch (PendingIntent.CanceledException ex) {
                        ex.printStackTrace();
                    }

                }

            }

        });

        return builder.create();
    }

githubにUPしました。
https://github.com/ynakayu/DialogFragmentSample.git

環境

Android API 22

SNSでもご購読できます。

スポンサードリンク

カテゴリー

アーカイブ

コメントを残す

*