kotlinでandroid入門 DialogFragment 1

ダイアログを使って、入力を行う方法
レイアウトを使用する方法もありますが、まずは使わずに行う単純なパターン

![testDailog.png](https://qiita-image-store.s3.amazonaws.com/0/258658/2f2f5f1e-c138-c43a-b4be-308da1886199.png)

こんなダイアログでます


### 画面レイアウト

#### activity_main.xml

```
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <Button
        android:id="@+id/btnOpenDialog"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        app:layout_constraintBottom_toTopOf="@+id/textView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/btnOpenDialog" />
</android.support.constraint.ConstraintLayout>
```

ボタン：おしたらダイアログを表示させる
TextView：ダイアログで入力したデータを表示させる

### コード

#### MainActivity.kt

```kotlin
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // ボタン押されたらダイアログ表示
        btnOpenDialog.setOnClickListener {
            val dialog : ClsTextInputDialog = ClsTextInputDialog(this)
            // ダイアログ用にクラスを作っているのでそこに設定している
            dialog.dialogTitle = "テキスト入力"
            dialog.dialogMessage = "文字を入力してください！"
            dialog.dialogTextData = textView.text.toString()
            dialog.onOkClickListener = DialogInterface.OnClickListener { _,_->
                // OK選択時の処理                                                        
                val textData = dialog.dialogTextData
                textView.text = textData
            }
            dialog.isCancelButton = true
            // ダイアログ表示
            dialog.openDialog(supportFragmentManager)
        }
    }
}

```

ボタンを押されたら、ダイアログの表示、動作を設定して表示している


#### ClsTextInputDialog.kt

ダイアログ用のクラス
DialogFragment にインタフェースを追加している

```kotlin
class ClsTextInputDialog( mc:Context) {
  // テキスト入力用のダイアログ
    private val mDialog = MyDialog()
    init {
        mDialog.mEdit =  EditText(mc)
    }
    // タイトル
    var dialogTitle : String
        get() {
            return mDialog.mTitle
        }
        set(value) {
            mDialog.mTitle = value
        }
    // メッセージ
    var dialogMessage : String
        get() {
            return mDialog.mMsg
        }
        set(value) {
            mDialog.mMsg = value
        }
    // 入力データ
    var dialogTextData : String
        get() {
            if ( null != mDialog.mEdit) {
                mDialog.mTextData = mDialog.mEdit?.text.toString()
            }
            return mDialog.mTextData
        }
        set(value) {
            mDialog.mTextData = value
        }
    // OK時の処理
    var onOkClickListener : DialogInterface.OnClickListener
        get() {
            // 実際には使用しない
            return DialogInterface.OnClickListener {_, _ -> }
        }
        set(value) {
            mDialog.isOkButton = true
            mDialog.onOkClickListener = value
        }
    // キャンセルボタンの使用
    var isCancelButton : Boolean
        get() {
            return mDialog.isCancelButton
        }
        set(value) {
            mDialog.isCancelButton = value
        }
  // キャンセル時の処理
  var onCancelClickListener : DialogInterface.OnClickListener
        get() {
            // 実際には使用しない
            return DialogInterface.OnClickListener {_, _ -> }
        }
        set(value) {
            mDialog.isCancelButton = true
            mDialog.onCancelClickListener = value
        }
    // ダイアログの表示
    fun openDialog(manager: FragmentManager) {
        mDialog.show( manager,"dialog")
    }
    // 
    class MyDialog : DialogFragment() {
        // パラメータ未設定時の基本状態
        var mTitle : String = ""
        var mMsg  : String = ""
        var mEdit : EditText? = null
        var mTextData : String = ""
        var isOkButton : Boolean = false
        var onOkClickListener      : DialogInterface.OnClickListener = DialogInterface.OnClickListener {_, _ -> }
        var isCancelButton : Boolean = false
        var onCancelClickListener : DialogInterface.OnClickListener = DialogInterface.OnClickListener { _, _ -> }
        //
        override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
            // 実際は AlertDialog を使用
            val dialogBuilder = AlertDialog.Builder(activity!!)
            // ここで、設定　
            if (mTitle.isNotEmpty()) {
                dialogBuilder.setTitle(mTitle)
            } else {
                dialogBuilder.setTitle("dialog")
            }
            if (mMsg.isNotEmpty()) {
                dialogBuilder.setMessage(mMsg)
            }
            if (mTextData.isNotEmpty()) {
                mEdit?.setText( mTextData )
                dialogBuilder.setView(mEdit)
            }
            if (isOkButton) {
                dialogBuilder.setPositiveButton(getString(android.R.string.ok), onOkClickListener)
            }
            if (isCancelButton) {
                dialogBuilder.setNegativeButton(getString(android.R.string.cancel), onCancelClickListener)
            }
            return dialogBuilder.create()
        }
        // onPause でダイアログを閉じている
        override fun onPause() {
            super.onPause()
            dismiss()
        }
    }
}
```

ダイアログへの設定があればその値を使用して、なければデフォルトで表示します


コードは[Git](https://github.com/bokufolivora/testDialog1)に置いてます