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ですっきりするするのが良いですよね(^_^)
リンク
リンク