Android開発〜ダイアログを出してみる〜

#はじめに
こんにちは。某学校でプログラミング等の勉強中のサーバーサイドのプログラマーのワタタクです。:relaxed:
今回もAndroid開発していきましょう。

#対象者
- Javaがなんとなく書ける人。
- Android開発が曖昧だけど多少できる人。　

#ダイアログの表示
##ダイアログの構成
<img width="241" alt="スクリーンショット 2018-11-12 11.15.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/116696/57458a1a-926c-8d7f-c39a-760c68881e08.png">
##ダイアログの作成・表示手順
アラートダイアログの作成・表示処理は以下の通り。
**1) DialogFragment を継承したクラスを作成する。**

```
public class SimpleDialogFragment  extends DialogFragment {
```
**2) onCreateDialog() メソッドにダイアログ本体の生成処理を記述する。**

```
public Dialog onCreateDialog( ... ) { 
    ダイアログ生成処理(後述)
}
```
**3) アクティビティなどでダイアログを表示する際、以下のコードを記述する**

- 上記クラスを new する。

```
SimpleDialogFragment dialog = new SimpleDialogFragment();
```
- フラグメントマネージャを取得する。

```
FragmentManager manager = getSupportedFragmentManager();
```
- show( ) メソッドでダイアログを表示する。

```
< 引数は以下の2個。 >
第 1 : フラグメントマネージャ
第 2 : ダイアログを識別するタグ文字列(任意の文字列)
dialog . show ( manager , “ ... ” );
```

*(注)*
``DialogFragment.FragmentManagerともにv4パッケージの物を import する。``

```
○ import android.support.v4.app.FragmentManager 

× import android.app.FragmentManager
```
##ダイアログ本体の生成手順
自作したダイアログフラグメントクラスの onCreateDialog() メソッドに記述するアラー トダイアログ本体の生成処理は以下の手順で行う。

**1) アラートダイアログビルダオブジェクトを生成する。**

```
AlertDialog.Builder builder = new AlertDialog.Builder( コンテキスト );
```
**2) 表示内容を設定する。**

```
・コンテンツエリア
builder.setMessage( ... );
・タイトル
builder.setTitle( ... );
```
**3) アクションボタンを設定する。** 

```
builder . setPositiveButton( “ ボタンラベル ” , ボタンタップ時のリスナオブジェクト(後述)); 
```
他に *setNegativeButton()*、*setNeutralButton()* がある。

**4) ダイアログオブジェクトを生成する。**

```
AlertDialog dialog = builder.create( ) ;
```
           
*(注)*
``AlertDialog クラスは、v7 パッケージのものを import する``
#クリック処理
アラートダイアログのアクションボタンタップ時の処理は、リスナクラスに記述する。
手順は以下の通り。
**1) DialogInterface.OnClickListener インタフェースを実装 ( implements ) したネストクラスを作成する。**

**2) onClick( ) メソッドに処理を記述する。**

```
private class DialogButtonClickListener implements DialogInterface.OnClickListener {
        @Override
        public void onClick(DialogInterface dialog（ダイアログ本体）, int which（タップされたボタンの定数値）) {
            //クリック処理
        }
}
```
*(注)*
``アクションボタンが複数ある場合、ボタンごとにリスナクラスを用意して良いが、第 2 引数 ( int which ) を使って分岐させても良い。``
#アクティビティとの連携
**(1) アクティビティの取得**

ダイアログフラグメント内でダイアログ本体が表示されるアクティビティを取得するには、**getActivity()** メソッドを使う。

```
Activity parent = getActivity();
```
**(2) データわたし**
 
アクティビティからダイアログフラグメントにデータを渡すには以下の方法をとる。
**1) Bundle オブジェクトを生成する。**

```
Bundle extras = new Bundle();
```
**2) onClick() メソッドに処理を記述する。** 

```
extends.putデータ型( “名前” , 値 );
```
**3) ダイアログフラグメントオブジェクトに 2) の Bundle オブジェクトをセットする。**

```
dialog.setArgments(extends);
```
**4) ダイアログフラグメント内では、getArgments( ) メソッドで上記 Bundle オブジェクトを取得し、 データを取り出す。
→ 取り出し方は、Intent の時と同じ(あらかじめ null チェックをしておく。)**
##サンプルコード

```java:FullDialogFragment.java
public class FullDialogFragment extends DialogFragment {
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("通常ダイアログ");
        builder.setMessage("よろしいですか?");
        builder.setPositiveButton("ok", new DialogButtonClickListener());
        builder.setNeutralButton("??", new DialogButtonClickListener());
        builder.setNegativeButton("NG", new DialogButtonClickListener());
        AlertDialog dialog = builder.create();
        return dialog;
    }

    /**
     * ダイアログのボタンが押されたときの処理が記述されたメンバクラス。
     */
    private class DialogButtonClickListener implements DialogInterface.OnClickListener {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            Activity parent = getActivity();
            String msg = "";
            switch (which) {
                case DialogInterface.BUTTON_POSITIVE:
                    msg = "通常ダイアログ: OKが選択されました。";
                    break;
                case DialogInterface.BUTTON_NEUTRAL:
                    msg = "通常ダイアログ: ??が選択されました。";
                    break;
                case DialogInterface.BUTTON_NEGATIVE:
                    msg = "通常ダイアログ: NGが選択されました。";
                    break;
            }
            Toast.makeText(parent, msg, Toast.LENGTH_SHORT).show();
        }
    }
}
```
アクティビティクラス(抜粋)

```java
FullDialogFragment dialog = new FullDialogFragment(); 
FragmentManager manager = getSupportFragmentManager();
dialog.show(manager,"FullDialogFragment");
```
#TIPS
##日付選択ダイアログ
日付選択ダイアログは**DatePickerDialog**を「new」して**show()**すればいい。
引数は以下の通り。

- ①コンテキスト
- ②リスナオブジェクト
- ③初期値の「年」
- ④初期値の「月」　→　Javaの「月」は内部的に*０*始まり。
- ⑤初期値の「日」

リスナオブジェクトは**DatePickerDialog.OnDateSetListener**インターフェースを*implements*し、**onDateSet()**メソッドに処理を記述。
引数は以下の通り。

- ①日付指定用画面部品
- ②選択された「年」
- ③選択された「月」
- ④選択された「日」

###サンプルコード
```java
public void showDatePickerDialog(View view){
        Calendar cal = Calendar.getInstance();
        int nowYear = cal.get(Calendar.YEAR);
        int nowMonth = cal.get(Calendar.MONTH);
        int nowDayOfMonth = cal.get(Calendar.DAY_OF_MONTH);

        DatePickerDialog dialog = new DatePickerDialog(DialogSampleActivity.this, new DatePickerDialogDateSetListener(),nowYear,nowMonth,nowDayOfMonth);
        dialog.show();
}

private class DatePickerDialogDateSetListener implements DatePickerDialog.OnDateSetListener {

        @Override
        public void onDateSet(DatePicker view,int year,int month,int dayOfMonth) {
            String msg = "日付選択ダイアログ:" + year + "年" + (month + 1) + "月" + dayOfMonth + "日";
            Toast.makeText(DialogSampleActivity.this, msg, Toast.LENGTH_SHORT).show();
        }
}
```
##時刻選択ダイアログ

時刻選択ダイアログは**TimePickerDialog**を「new」して**show()**すればいい。
引数は以下の通り。

- ①コンテキスト
- ②リスナオブジェクト
- ③初期値の「時」（24時間単位）
- ④初期値の「分」　
- ⑤24時間表示かどうか（trueが24時間表記）

リスナオブジェクトは**TimePickerDialog.OnTimeSetListener**インターフェースを*implements*し、**onTimeSet()**メソッドに処理を記述。
引数は以下の通り。

- ①時刻指定用画面部品
- ②選択された「時」
- ③選択された「分」

###サンプルコード

```java
public void showTimePickerDialog(View view){
        TimePickerDialog dialog = new TimePickerDialog(DialogSampleActivity.this, new TimePickerDialogTimeSetListener(),0,0,true );
        dialog.show();
}

private class TimePickerDialogTimeSetListener implements TimePickerDialog.OnTimeSetListener {

        @Override
        public void onTimeSet(TimePicker view,int hourOfDay,int minute) {
            String msg = "時間選択ダイアログ:" + hourOfDay + "時" + minute + "分";
            Toast.makeText(DialogSampleActivity.this, msg, Toast.LENGTH_SHORT).show();
        }
}
```
以上。Androidでのダイアログの出し方でした。
もし何か間違っている等のご指摘があればご連絡ください。
最後まで読んで頂きありがとうございました。