コピペしてすぐ使えるアラートダイアログ集

# 注意事項（2016/7/14追記）
画面回転時のメモリーリークを防ぐため、下記のような DialogFragment を作成することを推奨します。

```java
public class SampleDialogFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new AlertDialog.Builder(getActivity())
                .setTitle("タイトル")
                .setMessage("メッセージ")
                .create();
    }

    @Override
    public void onPause() {
        super.onPause();
        
        // onPause でダイアログを閉じる場合
        dismiss();
    }
}
```

# はじめに
あのタイプのダイアログってどう出すんだっけ、とよく忘れてしまうので、コピペしてすぐ使えるようにメモ。サンプルは Fragment 内で実行するケースのものであり、Negative ボタンはキャンセルボタンとして扱っています。

公式サイトの参考ページはこちら。
http://developer.android.com/guide/topics/ui/dialogs.html
http://developer.android.com/reference/android/app/AlertDialog.Builder.html

## タイトル、メッセージ、OK
![1.png](https://qiita-image-store.s3.amazonaws.com/0/39324/549deb30-fa9c-c675-47f9-b0fa128951c1.png "1.png")

```java
new AlertDialog.Builder(getActivity())
        .setTitle("title")
        .setMessage("message")
        .setPositiveButton("OK", null)
        .show();
```



## タイトル、メッセージ、OK/Cancel
![2.png](https://qiita-image-store.s3.amazonaws.com/0/39324/d82b05e2-2036-f056-a2dc-8b62a398b8df.png "2.png")

```java
new AlertDialog.Builder(getActivity())
        .setTitle("title")
        .setMessage("message")
        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // OK button pressed
            }
        })
        .setNegativeButton("Cancel", null)
        .show();
```



## タイトル、メッセージ、YES/Later/NO
評価メッセージとかでよくみるやつですね。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/39324/35728f6d-9039-9d24-1604-65f8ee709f1b.png "3.png")

```java
new AlertDialog.Builder(getActivity())
        .setTitle("title")
        .setMessage("message")
        .setPositiveButton("YES", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // YES button pressed
            }
        })
        .setNeutralButton("Later", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // Later button pressed
            }
        })
        .setNegativeButton("No", null)
        .show();
```

## A/B/C からひとつ選択する

![4.png](https://qiita-image-store.s3.amazonaws.com/0/39324/01a85db5-7935-83e6-9727-9a77c661d015.png "4.png")

```java
final String[] items = {"item_0", "item_1", "item_2"};
new AlertDialog.Builder(getActivity())
        .setTitle("Selector")
        .setItems(items, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // item_which pressed
            }
        })
        .show();
```

## A/B/C から1つ選択する（確認ボタンつき）
![5.png](https://qiita-image-store.s3.amazonaws.com/0/39324/838d18b3-aa31-06dd-ead9-e594f83c6326.png "5.png")


**内容に誤りがありましたので訂正しました。**

```java
final String[] items = {"item_0", "item_1", "item_2"};
int defaultItem = 0; // デフォルトでチェックされているアイテム
final List<Integer> checkedItems = new ArrayList<>();
checkedItems.add(defaultItem);
new AlertDialog.Builder(getActivity())
        .setTitle("Selector")
        .setSingleChoiceItems(items, defaultItem, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                checkedItems.clear();
                checkedItems.add(which);
            }
        })
        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                if (!checkedItems.isEmpty()) {
                    Log.d("checkedItem:", "" + checkedItems.get(0));
                }
            }
        })
        .setNegativeButton("Cancel", null)
        .show();
```

## 複数選択
![6.png](https://qiita-image-store.s3.amazonaws.com/0/39324/5412e2bf-bfe2-449c-a12e-e5c2dc1022b4.png "6.png")


```java
final String[] items = {"item_0", "item_1", "item_2"};
final ArrayList<Integer> checkedItems = new ArrayList<Integer>();
new AlertDialog.Builder(getActivity())
        .setTitle("Selector")
        .setMultiChoiceItems(items, null, new DialogInterface.OnMultiChoiceClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                if (isChecked) checkedItems.add(which);
                else checkedItems.remove((Integer) which);
            }
        })
        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                for (Integer i : checkedItems) {
                    // item_i checked
                }
            }
        })
        .setNegativeButton("Cancel", null)
        .show();
```


## カスタムレイアウト
![7.png](https://qiita-image-store.s3.amazonaws.com/0/39324/97c0b61a-9219-d658-e46f-68261c648c01.png "7.png")

```java
View view = getActivity().getLayoutInflater().inflate(R.layout.custom_layout, null);
new AlertDialog.Builder(getActivity())
        .setView(view)
        .show();
```

## その他よく使いそうなメソッド
> AlertDialog.Builder#setIcon

タイトルに使われるアイコンをセットする

> AlertDialog.Builder#setCancelable

ダイアログをキャンセルできるかどうかを指定する