Android KotlinでDialogFragmentを扱う


Javaで記述したDialogFragmentをKotlinに自動変換行った時、

method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter savedInstanceState

とエラーが出ることがあります。これはエラーメッセージの通りsavedInstanceStateにnullが渡される可能性があるので、オプショナル型で受け取る必要があります。

class MyDialogFragment: DialogFragment() {

    //method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter savedInstanceState
    //Bundle を Bundle? とします
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    }
}
DialogFragmentの実装

実装はKotlinらしくapplyを利用して比較的すっきり記述することができます。

各ラベル内容をBundleで渡し、リスナーの実装を定義できるようにすることである程度使い回し可能なクラス定義となります。

class MyDialogFragment: DialogFragment() {

    var onPositiveListener:DialogInterface.OnClickListener? = null
    var onNegativeListener:DialogInterface.OnClickListener? = null

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val builder = AlertDialog.Builder(context!!)
        builder.apply {
            setTitle(arguments?.getString("title"))
            setMessage(arguments?.getString("message"))
            setPositiveButton(arguments?.getString("positiveButtonLabel"), onPositiveListener)
            setNegativeButton(arguments?.getString("negativeButtonLabel"),onNegativeListener)
        }
        // Create the AlertDialog object and return it
        return builder.create()
    }
}
DialogFragmentの利用例

こちらもapplyを用いて以下のように記述できます。

MyDialogFragment().apply {
    arguments = Bundle().apply {
        putString("title", "確認してください")
        putString("message", "規約に同意します")
        putString("positiveButtonLabel", "はい。同意します")
        putString("negativeButtonLabel", "いいえ")
    }
    //OKボタンリスナー
    onPositiveListener = DialogInterface.OnClickListener { dialog, which ->
    }
}.show(supportFragmentManager, "test")

applyですっきりするするのが良いですよね(^_^)