Android Studio ダイアログの構成要素

##Androidのダイアログ構成
![Group 4 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1098849/e5d435c6-8b18-1692-e9f2-901adcce45e0.png)


Androifのダイアログ構成で最低限必要なものは、
``・コンテンツエリアボタン``
``・アクションボタン１つ``
だけです。

アクションボタンは、３種類あり、それぞれの位置関係は、上図の通りです。


##ダイアログ表示の手順
``1,``**``DialogFragment``**``を継承したクラスを作成する。``
``2,``**``onCreateDialog``**``メソッドにダイアログ生成処理を記述し、生成したダイアログオブジェクトをリターンする。``←ここがややこしい！
``3,アクティビティでは``**``1``**``のオブジェクトを生成し、show（）メソッドを実行する。``

>**今回の画面構成**
画面上のリストビューをタップ
→ダイアログ表示される（画面遷移ではなく、最初の画面の上に表示される）
→ダイアログのアクションボタンタップ
→それぞれで違うメッセージがトースト表示される（数秒で消える）

今回では、リストビューは設定してあることが前提で話を進めていきます。
リストビューについては[こちら](https://qiita.com/nipp/items/b65e520783c6d03b9abb)を参照

##1,DialogFragmentを継承したクラスを作成する。
∟ダイアログ生成クラスを作成する（java>パッケージ名>右クリック>new>Kotlin File/Class）
∟フラグメントクラスを作成します。

>※フラグメントクラスの大きな特徴としては、複数のペインを持つことができることと複数のライフサイクルを跨いで値を保持できることです。Activityの上で動作するので、Activityのライフサイクルに合わせてペインを生成・破棄します。
Fragmentとは、簡単にいうと、コンテンツとライフサイクルを持ったビューです。部品のことで、サブアクティビティ的な立ち位置です。
[参照](https://developer.android.com/guide/fragments)

**私もいまいちピンと来ていませんが、Fragmentクラスはアクティビティではなく、アクティビティから呼び出されるオブジェクトだと理解しています。**（間違っていたらすみません。）

####サンプルコード

```
class OrderConfirmDialogFragment : DialogFragment() {
```

##2,onCreateDialogメソッドにダイアログ生成処理を記述し、生成したダイアログオブジェクトをリターンする。

この部分が難しかったです！

###手順
####1,ビルダークラスを用意
∟Androidでダイアログを生成するには、``AlertDialog``オブジェクトを生成する必要がある
→そのために、まず``AlertDialog.Builder``オブジェクトを生成する必要があります。

サンプルコード２行目の「activity?.let」は、フラグメントクラスはactivitクラスを継承していないので、activityで使用されているプロパティが使えないことが多々あります。
そこで使用するのが``Nullableプロパティ``の``activityプロパティ``です。
``Nullableプロパティ``なので、``セーフコール演算子？.``を使用し、nullでない場合にオブジェクトを生成させるように設定します。

###2,表示,アクションボタンを設定する
``setMassage()``メソッドや、``setTitle()``メソッドを使用し、引数にR値を指定することで、様々な表示の設定をします。

``setPositiveButton()``メソッドなどを使用し、アクションボタンの設定をします。
引数には、（ボタン表示文字列,ボタンがタップされた時のリスナクラスの指定）をしています。

###4,ダイアログオブジェクトを生成する
Kotlinでは、クラスを記述しても実装しなければ意味がありません。
それと同じ理屈で、ダイアログオブジェクトを生成します。
そこで使用するのが、``create()``メソッドです。

最終行で``?: throw IllegalStateException("アクティビティがnullです")``としているのは、``エルビス演算子?.``で、nullの場合の処理を記述しています。

それぞれの設定画面は一番上に記載しています。参照ください。






###サンプルコード

```
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        //アクティビティがnull出ないならばダイアログオブジェクトを生成
        val dialog = activity?.let {
            val builder = AlertDialog.Builder(it)
            //ダイアログのタイトルを設定
            builder.setTitle(R.string.dialog_title)
            //ダイアログメッセージを設定
            builder.setMessage(R.string.dialog_msg)
            //Positive Buttonを設定
            builder.setPositiveButton(R.string.dialog_btn_ok, DialogButtonClickListener())
            //Negative Buttonを設定
            builder.setNegativeButton(R.string.dialog_btn_ng,DialogButtonClickListener())
            //Neutral Buttonを設定
            builder.setNeutralButton(R.string.dialog_btn_nu, DialogButtonClickListener())
            //ダイアログオブジェクトを生成
            builder.create()
        }
        //生成したダイアログオブジェクトをリターン
        return dialog ?: throw IllegalStateException("アクティビティがnullです")
    }
```

##3,アクティビティでは1のオブジェクトを生成し、show（）メソッドを実行する。


####サンプルコード

```MainActivity.kt
            //注文確認ダイアログフラグメントオブジェクトを生成
            val dialogFragment = OrderConfirmDialogFragment()
            //ダイアログ表示
            dialogFragment.show(supportFragmentManager, "OrderConfirmDialogFlagment")
```