AndroidStudio ダイアログを表示させる

## リストをタップするとダイアログを表示させる
:::note info
## イメージ
![携帯.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953063/fb4e0a1f-f29e-397b-cf5b-afcd88cd2aa1.gif)
トーストはおまけ
:::

**前提**
[リストを作成](https://qiita.com/mk-000856/items/104bd7075fd90e22fd23)できる
[クリックイベント](https://qiita.com/mk-000856/items/8dcc569e9e106b1e5a82)を設定できる

app → java → com.・・・の上で右クリック　→　javaクラスを選択
java ファイルを作成
今回は**TestDialog**とする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953063/e142a617-b32a-9ba9-43b4-a2b65c44de61.png)

~~~java:クラスとメソッド
public class TestDialog extends DialogFragment {
    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState){
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("ダイアログタイトル");
        builder.setMessage("メッセージ\n"+listItemText+"を選んだ");
        builder.setPositiveButton("ポジ",new TestDialogClick());
        builder.setNegativeButton("ネガ",new TestDialogClick());
        builder.setNeutralButton("ニュー",new TestDialogClick());
        return builder.create();
    }
    
    private class TestDialogClick implements DialogInterface.OnClickListener{
        @Override
        public void onClick(DialogInterface dialog,int which){
            String msg = "";
            switch (which){
                case -1:
                    msg ="ポジティブボタンをクリック";
                    break;
                case -2:
                    msg ="ネガティブボタンをクリック";
                    break;
                case -3:
                    msg ="ニュートラルボタンをクリック";
                    break;
            }
            Toast.makeText(getActivity(),msg,Toast.LENGTH_LONG).show();
        }
    }
}
~~~
## ダイアログ作成
:::note info
### ダイアログビルダーを作成し設定する
~~~java:public Dialog onCreateDialogの内容
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState){
    //ダイアログの作成
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    //ダイアログのタイトル
    builder.setTitle("ダイアログタイトル");
    //ダイアログのメッセージ
    builder.setMessage("メッセージ\n"+listItemText+"を選んだ");
    //ポジティブボタン
    builder.setPositiveButton("ポジ",new TestDialogClick());
    //ネガティブボタン
    builder.setNegativeButton("ネガ",new TestDialogClick());
    //ニュートラルボタン
    builder.setNeutralButton("ニュー",new TestDialogClick());
    //ダイアログを表示
    return builder.create();
}
~~~
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953063/e0159311-f826-65d2-b5c9-504188a68cc3.png)
:::

### ３つのボタンについて
ポジティブ、ネガティブ、ニュートラルの３つが設定可能
場所はそれぞれのボタンで固定となる
記載しなかった場合にはダイアログに表示されない
ポジティブボタン
builder.setPositiveButton("ポジ",new TestDialogClick());
ネガティブボタン
builder.setNegativeButton("ネガ",new TestDialogClick());
ニュートラルボタン
builder.setNeutralButton("ニュー",new TestDialogClick());

:::note info
**引数２の new TestDialogClick()**
これはボタンが押された時の処理となる
:::

## TestDialogClickの作成
set〇〇Buttonの引数２用のクラスを作成
~~~java:private class TestDialogClickの内容
public class TestDialog extends DialogFragment {
    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState){
        //省略
    }
    
    //ダイアログの各ボタンが押された時
    private class TestDialogClick implements DialogInterface.OnClickListener{
        @Override
        public void onClick(DialogInterface dialog,int which){
            String msg = "";
            switch (which){
                //ポジティブ
                case -1:
                    msg ="ポジティブボタンをクリック";
                    break;
                //ネガティブ
                case -2:
                    msg ="ネガティブボタンをクリック";
                    break;
                //ニュートラル
                case -3:
                    msg ="ニュートラルボタンをクリック";
                    break;
            }
            //トーストを出す
            Toast.makeText(getActivity(),msg,Toast.LENGTH_LONG).show();
        }
    }
}
~~~
:::note info
**引数2　int which**
<table>
<caption>ボタンと格納される数値
<thead>
<tr><th>ポジティブ　　<th>　-1
<tr><th>ネガティブ　　<th>　-2
<tr><th>ニュートラル　　<th>　-3
</table>
:::
上記数値をswitch文で分岐させトーストに何を押したかを表示させる
~~~java
String msg = "";
        switch (which){
            //ポジティブ
            case -1:
                msg ="ポジティブボタンをクリック";
                break;
            //ネガティブ
            case -2:
                msg ="ネガティブボタンをクリック";
                break;
            //ニュートラル
            case -3:
                msg ="ニュートラルボタンをクリック";
                break;
        }
        //トーストを出す
        Toast.makeText(getActivity(),msg,Toast.LENGTH_LONG).show();
    }
}
~~~
<table>
<caption>swichのcaseに設定している数値は下記のようにも指定可能
<thead>
<tr><th>　　　　　　　コード　　<th>　　値
<tr><th>DialogInterface.BUTTON_POSITIVE　　<th>　　-1　　
<tr><th>DialogInterface.BUTTON_NEGATIVE　　<th>　　-2　
<tr><th>DialogInterface.BUTTON_NEUTRAL　　 <th>　　-3　
</table>

## MainActivity.javaへ処理を記載
~~~java
public class MainActivity extends AppCompatActivity {

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

        //リストをタップ
        ListView listview = findViewById(R.id.testList);
        listview.setOnItemClickListener(new ListClickTest());
    }

    //リストをタップした時の処理
    private class ListClickTest implements AdapterView.OnItemClickListener{
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long notInUse){
            TestDialog dialog = new TestDialog();
            dialog.show(getSupportFragmentManager(),"TestDialog");
        }
    }
}
~~~

:::note info
## ダイアログを表示させる
~~~java:private class ListClickTestの内容
//リストをタップした時の処理
private class ListClickTest implements AdapterView.OnItemClickListener{
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long notInUse){
        TestDialog dialog = new TestDialog();
        dialog.show(getSupportFragmentManager(),"TestDialog");
    }
}
~~~

- **作成したTestDialogのインスタンスを作成**
TestDialog dialog = new TestDialog();

- **ダイアログを表示**
dialog.show(getSupportFragmentManager(),"TestDialog");
**引数１**：getSupportFragmentManager()
　とりあえずこれを指定しておけばOK
**引数２**："TestDialog"
　インスタンスを生成したクラス名を文字列で指定
:::


これで、タップした時にダイアログが表示される。
※ただしダイアログのメッセージに表示される"～を選んだ"の～の部分はタップしたアイテムの文字列を渡して設定してあげないといけない