LoginSignup
1
4

More than 5 years have passed since last update.

kotlinでandroid入門 DialogFragment 1

Posted at

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

testDailog.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

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 にインタフェースを追加している

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に置いてます

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4