💎

【Android】DialogFragment のクリックイベントを取得する

2021/08/22に公開

DialogFragmentにクリックイベントのインターフェイスを定義して、Activity側で継承します。

実装例

MyDialog.kt

class MyDialog : DialogFragment() {

    private lateinit var listener: OnMyDialogListener

    interface OnMyDialogListener {
        fun clickPositiveButton()
        fun clickNegativeButton()
    }

    // ActivityがOnMyDialogListenerを継承していない場合、例外をスローする
    override fun onAttach(context: Context) {
        super.onAttach(context)
        kotlin.runCatching {
            listener = (context as OnMyDialogListener)
        }.onFailure {
            throw NotImplementedError("OnMyDialogListenerを継承して下さい")
        }
    }

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        return AlertDialog.Builder(requireActivity()).apply {
            setTitle("タイトル")
            setMessage("クリックイベントを伝えるよ")
            setPositiveButton("ok") { _, _ -> listener.clickPositiveButton() }
            setNegativeButton("cancel") { _, _ -> listener.clickNegativeButton() }
        }.create()
    }

    companion object {
        fun newInstance() = MyDialog()
    }
}

MainActivity

class MainActivity : AppCompatActivity(), MyDialog.OnMyDialogListener {

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

        findViewById<Button>(R.id.show_dialog_button).setOnClickListener {
            MyDialog.newInstance().show(supportFragmentManager, this::class.java.simpleName)
        }
    }

    override fun clickPositiveButton() {
        Toast.makeText(this, "ok", Toast.LENGTH_SHORT).show()
    }

    override fun clickNegativeButton() {
        Toast.makeText(this, "cancel", Toast.LENGTH_SHORT).show()
    }
}

Discussion