Android

Pocket

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

MacでAndroidの開発環境を構築する方法

Pocket

Android開発環境の構築方法メモ

下記サイトがわかりやすいです。
実際にうまくいきました。

MacでAndroid開発環境を手早く整える | appfountain’s blog

iOSの開発環境構築と比べると、Androidの開発環境構築はやや面倒ですね。

Android Design: googleが優れたAndroidのデザインを学習出来るサイトを公開

Pocket

googleが優れたデザインのAndroidアプリケーションを設計する方法を学習出来るサイト「Android Design」を公開しています。

Androidアプリを開発する時は、一通り目を通してから開発したいなと思います。

詳細まで読んでいませんが、サイトを見ていると、AndoridのUIがiPhoneのように、徐々に洗練されて来ているような印象を受けます。

参照:Android Design