Android日期选择器对话框上下文参数



我正在玩android,我想在我的应用程序中创建一个日期选择器。我在developer.android.com上学习了教程,其中显示了以下代码:

class DatePickerFragment : DialogFragment(), DatePickerDialog.OnDateSetListener {
override fun onCreateDialog(savedInstanceState: Bundle): Dialog {
// Use the current date as the default date in the picker
val c = Calendar.getInstance()
val year = c.get(Calendar.YEAR)
val month = c.get(Calendar.MONTH)
val day = c.get(Calendar.DAY_OF_MONTH)
// Create a new instance of DatePickerDialog and return it
return DatePickerDialog(activity, this, year, month, day)
}
override fun onDateSet(view: DatePicker, year: Int, month: Int, day: Int) {
// Do something with the date chosen by the user
}
}

然而,当我使用此代码时,androidstudio抱怨DatePickerDialog:的第一个参数存在类型不匹配

Type mismatch.
Required: Contex
Found: FragmentActivity?

我还尝试将上下文获取为activity?.applicationContext,但这也不能解决问题。

是因为FragmentActivity?是可为Null的?,所以需要一个不可为null的Context。您可以使用:

requireContext()

函数requireContext()是在Kotlin中以片段形式获取不可为null的上下文的推荐方法。这并不意味着不能为null,Context总是可以以null结尾。该函数所做的是在为null时抛出异常,这就是为什么您可以将其当作非null使用。该异常通常从不抛出,如果发生这种情况,是因为它是在Context可用之前或之后使用的,所以使用context!!也会崩溃。

使用activity!!.applicationContext也可以,但这是从可为null转换为不可为null,因此不建议使用。

这与requireActivity()非常相似

你可以尝试的最后一件事是使用this,也就是Fragment,遗憾的是你不能

val context: Context = this

这不是null,因为如果正在做某件事,则片段不是null,但片段不像活动那样从Context扩展(如果您继承活动的上下文,则3个更高的父级是ContextThemeWrapperContextWrapperContext(

最新更新