我正在玩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个更高的父级是ContextThemeWrapper
、ContextWrapper
和Context
(