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

Android Date Picker dialog context parameter

我正在玩 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
    }
}

但是,当我使用此代码时 android studio 抱怨 DatePickerDialog 的第一个参数类型不匹配:

Type mismatch.
Required: Contex
Found: FragmentActivity?

我也尝试获取上下文 activity?.applicationContext 但这也没有解决问题。

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

requireContext()

函数 requireContext() 是在 Kotlin 中以片段的形式获取不可空上下文的推荐方法。这并不意味着不可为空,Context 始终可以为空。该函数的作用是在为 null 时抛出异常,这就是为什么您可以像不为 null 一样使用它。大多数情况下不会抛出异常,如果它发生是因为它是在 Context 可用之前或之后使用的,所以使用 context!! 也会崩溃。

使用 activity!!.applicationContext 也可以,但这是从可空值转换为不可空值,因此不推荐使用。

这与 requireActivity()

非常相似

您可以尝试的最后一件事是使用 this,这将是 Fragment,遗憾的是您不能

val context: Context = this

那将不为空,因为片段在做某事时不为空,但片段不像活动那样从 Context 扩展(如果您遵循活动上下文的继承另外 3 个上级父项是 ContextThemeWrapperContextWrapperContext)