[Android] DialogFragmentを使ってダイアログを表示する


APIレベル13からActivity.showDialog(int id)は非推奨となってしまいました。
DialogFragmentを使ってダイアログを表示させる方法が推奨されています。
(2013年12月12日現在)

参考

- 公式ドキュメント Dialogs

http://developer.android.com/guide/topics/ui/dialogs.html#ShowingADialog

- DialogFragmentを利用するときのチェックポイント

http://www18.atwiki.jp/bovecrach/pages/74.html

## シンプルなアラートダイアログ

![kobito.1386850867.739619.png](https://qiita-image-store.s3.amazonaws.com/0/27793/5180e906-751d-a228-4f22-60f9ce430931.png "kobito.1386850867.739619.png")


※ 縦横切替時にTestDialogFragmentのコンストラクタがないと落ちるかもしれません(未確認)

~~~java:HogeActivity
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_top);

        // ダイアログを表示する
        DialogFragment newFragment = new TestDialogFragment();
        newFragment.show(getFragmentManager(), "test");
    }

    public static class TestDialogFragment extends DialogFragment {
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            // Use the Builder class for convenient dialog construction
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            builder.setMessage("ダイアログ")
                    .setPositiveButton("はい", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            // FIRE ZE MISSILES!
                        }
                    })
                    .setNegativeButton("キャンセル", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            // User cancelled the dialog
                        }
                    });
            // Create the AlertDialog object and return it
            return builder.create();
        }
    }


~~~

## リストを表示するダイアログ

iOSのActionSheetの変わりにするならこのダイアログだと思います。

![kobito.1386855856.924778.png](https://qiita-image-store.s3.amazonaws.com/0/27793/2d12cbaa-0fb2-f9ff-91a9-ae60d247f496.png "kobito.1386855856.924778.png")

~~~java:HogeActivity

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

        // ダイアログを表示する
        DialogFragment newFragment = new ContactUsDialogFragment();
        newFragment.show(getFragmentManager(), "contact_us");
    }

    public static class ContactUsDialogFragment extends DialogFragment {
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            CharSequence[] items = {"使い方", "よくある質問", "メール", "閉じる"};

			 Activity activity = getActivity();

            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            builder.setItems(items, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    switch (which) {
                        case 0:
                            Toast.makeText(activity, "使い方が押された", Toast.LENGTH_LONG).show();
                            break;
                        case 1:
							Toast.makeText(activity, "よくある質問が押された", Toast.LENGTH_LONG).show();
                            break;
                        case 2:
							Toast.makeText(activity, "メールが押された", Toast.LENGTH_LONG).show();
                            break;
                        case 3:
							Toast.makeText(activity, "閉じる", Toast.LENGTH_LONG).show();
                            break;
                        default:
                            break;
                    }
                }
            });
            return builder.create();
        }
    }

~~~

## カスタムダイアログ
![kobito.1388994152.377665.png](https://qiita-image-store.s3.amazonaws.com/0/27793/a1b723b5-b0ab-9e64-69d8-56908f5d5da2.png "kobito.1388994152.377665.png")


~~~java:HogeActivity
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_top);

        // ダイアログを表示する
        DialogFragment newFragment = new TestDialogFragment();
        newFragment.show(getFragmentManager(), "test");
    }

    public static class TestDialogFragment extends DialogFragment {
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            // Use the Builder class for convenient dialog construction
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

            LayoutInflater inflater = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View content = inflater.inflate(R.layout.dialog_setting, null);

            builder.setView(content);

            builder.setMessage("設定")
                    .setNegativeButton("閉じる", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            // User cancelled the dialog
                        }
                    });
            // Create the AlertDialog object and return it
            return builder.create();
        }
    }
~~~

~~~java:dialog_setting.xml
<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="340dp"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:paddingBottom="20dp">


        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="声音量"
            android:id="@+id/textView"
            android:layout_gravity="center_vertical"
            android:layout_weight="1"/>

        <SeekBar
            android:layout_width="10dp"
            android:layout_height="wrap_content"
            android:id="@+id/seek_bar_voice_volume"
            android:layout_gravity="center_vertical"
            android:max="1000"
            android:layout_weight="4"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="340dp"
        android:layout_height="wrap_content"
        android:orientation="horizontal">


        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="エコー"
            android:id="@+id/textView"
            android:layout_gravity="center_vertical"
            android:layout_weight="1"/>

        <SeekBar
            android:layout_width="10dp"
            android:layout_height="wrap_content"
            android:id="@+id/seek_bar_echo"
            android:layout_gravity="center_vertical"
            android:max="1000"
            android:layout_weight="4"/>
    </LinearLayout>

</LinearLayout>
~~~