a-2-5.モーダル表示(DialogFragment)

### a-2-5.モーダル表示(DialogFragment)

#### 目標設定
[一覧に戻る](https://qiita.com/ryouta33/items/57f5e51a26086151a0da)

#### 課題
3. DialogFragmentを利用してダイアログを表示できるか。
3. DialogFragmentからActivityへ入力内容を共有できるか。

#### Github

https://github.com/wakizaka24/AndroidTest

#### テスト実装

```kotlin:DialogFragmentTestActivity.kt
class DialogFragmentTestActivity : AppCompatActivity(), View.OnClickListener,
    DialogFragmentTestFragment.DialogListener {
    private lateinit var displayButton: Button

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_dialog_fragment_test)

        // 1. DialogFragmentを利用してダイアログを表示できるか。
        // ・可能でした。
        displayButton = findViewById(R.id.displayButton)
        displayButton.setOnClickListener(this)
    }

    override fun onClick(view: View){
        when (view.id) {
            R.id.displayButton -> {
                val dialogFragment = DialogFragmentTestFragment()
                dialogFragment.listener = this
                dialogFragment.show(supportFragmentManager, "dialog_fragment_test_dialog")
            }
        }
    }

    // 2. DialogFragmentからActivityへ入力内容を共有できるか。
    // ・可能でした。
    override fun onDialogPositive(dialog: DialogFragment) {
        Log.d("Dialog表示(Activity)", "OKボタン押下")
    }

    override fun onDialogNegative(dialog: DialogFragment) {
        Log.d("Dialog表示(Activity)", "キャンセルボタン押下")
    }

    override fun onDialogNeutral(dialog: DialogFragment) {
        Log.d("Dialog表示(Activity)", "あとでボタン押下")
    }
}
```

```xml:activity_dialog_fragment_test.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        android:layout_marginStart="23dp"
        android:layout_marginEnd="23dp"
        android:layout_marginTop="23dp"
        android:layout_marginBottom="23dp"
        >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="48dp"
            android:orientation="horizontal"
            tools:ignore="UselessParent">

            <Button
                android:id="@+id/displayButton"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:text="画面遷移"
                tools:ignore="HardcodedText" />

            <Space
                android:layout_width="30dp"
                android:layout_height="match_parent" />

        </LinearLayout>

    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>
```

```kotlin:DialogFragmentTestFragment.kt
class DialogFragmentTestFragment: DialogFragment() {
    interface DialogListener {
        fun onDialogPositive(dialog: DialogFragment)
        fun onDialogNegative(dialog: DialogFragment)
        fun onDialogNeutral(dialog: DialogFragment)
    }

    var listener: DialogListener? = null

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val builder = AlertDialog.Builder(activity)
        builder.setTitle("タイトル！")
            .setMessage("ダイアログのメッセージです。")
            .setPositiveButton("OK") { _, _ ->
                listener?.onDialogPositive(this)
                Log.d("Dialog表示", "OKボタン押下")
            }
            .setNegativeButton("キャンセル") { _, _ ->
                listener?.onDialogNegative(this)
                Log.d("Dialog表示", "キャンセルボタン押下")
            }
            .setNeutralButton("あとで") { _, _ ->
                listener?.onDialogNeutral(this)
                Log.d("Dialog表示", "あとでボタン押下")
            }

        return builder.create()
    }

//    override fun onAttach(context: Context) {
//        super.onAttach(context)
//        try {
//            listener = context as DialogListener
//        }catch (e: Exception){
//            Log.e("Dialog表示","ダイアログの表示に失敗しました。")
//        }
//    }
//
//    override fun onDetach() {
//        super.onDetach()
//        listener = null
//    }
}
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1545849/1143076c-c008-70e7-9b7e-93bcfa58d401.png
" width="300" />