目次

DialogFragmentの実装

表示したいようにxmlを編集して頂ければそのままダイアログとして表示されます。
MAX_HEIGHT, MAX_WIDTHを0.9Fにすれば縦横90%の大きさで表示されます。
画像のPopupWinodwのように一枚だけ画像を表示したい。などであれば、ImageViewをnewしてそのままDialog#setContentView()にImageViewを渡してやればxmlは不要です。

終了したいタイミングでdismiss()を呼ぶ。

public class CustomFragmentDialog extends DialogFragment {

    private static final String TAG = CustomFragmentDialog.class.getSimpleName();
    private static final float MAX_HEIGHT = 1.00F;
    private static final float MAX_WIDTH = 1.00F;

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

	View view = getActivity().getLayoutInflater().inflate(R.layout.fragment_dialog, null, false);
        Dialog dialog = new Dialog(getActivity());
        // タイトルバーを非表示
        dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        // フルスクリーン
        dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN );
        // デフォルトテーマを消して透明にする
        dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        // ダイアログの外をタッチした際にダイアログを消すかどうか
        dialog.setCanceledOnTouchOutside(false);
        dialog.setContentView(view);

        return dialog;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        Dialog dialog = getDialog();
        WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();
        DisplayMetrics metrics = getResources().getDisplayMetrics();
        int dialogWidth = (int) (metrics.widthPixels * MAX_WIDTH);
        int dialogHeight = (int) (metrics.heightPixels * MAX_HEIGHT);

        lp.width = dialogWidth;
        lp.height = dialogHeight;
//        lp.windowAnimations = R.style.DialogAnimation; // Dialogの表示アニメーション
        dialog.getWindow().setAttributes(lp);
    }
}

Dialogの表示

ActivityからFragmentDialog#show()で表示できます。第2引数にタグを設定することも出来ます。
タグやリクエストコードは定数化しておいたほうが良さそう。

FragmentManager manager = getFragmentManager();
CustomFragmentDialog dialog = new CustomFragmentDialog();
if (manager.findFragmentByTag("dialog") == null) {
	// onActivityResultでコールバックを受ける際のrequestCode
	dialog.setTargetFragment(null, 99);
	// Backキーでキャンセル可能かどうか
	dialog.setCancelable(false);
	// 値を渡す場合はDialogFragment#setArgument()する
	Bundle args = new Bundle();
	args.putInt("point", 100);
	dialog.setArguments(args);
	// 表示
	dialog.show(manager, "dialog");
}

Dialogから親Activityにコールバックを返す

ここで投げたPendingIntentは親ActivityのonActivityResultで受け取ります。
Intent#putExtra()で値を渡すこともできます。

public void fncCallback(String cb){
    Intent result = new Intent();
    result.putExtra("callback", cb);

    PendingIntent pi = getActivity().createPendingResult(getTargetRequestCode(), result,
            PendingIntent.FLAG_ONE_SHOT);
    try {
        pi.send(getActivity().RESULT_OK);
    } catch (PendingIntent.CanceledException e) {
        e.printStackTrace();
    }
}