💎
【Android】DialogFragment のクリックイベントを取得する
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