Je joue avec Android et je voulais créer un sélecteur de date dans mon application. J'ai suivi le tutoriel sur developer.android.com qui montre le code suivant :

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
    }
}

Cependant, lorsque j'utilise ce code, Android Studio se plaint qu'il y a une incompatibilité de type sur le premier paramètre de DatePickerDialog :

Type mismatch.
Required: Contex
Found: FragmentActivity?

J'ai également essayé d'obtenir le contexte comme activity?.applicationContext mais cela ne le résout pas non plus.

0
Jan Koci 13 nov. 2020 à 22:15

1 réponse

Meilleure réponse

C'est parce que FragmentActivity? est nullable ?, vous avez donc besoin d'un Context non nullable. Vous pouvez utiliser:

requireContext()

La fonction requireContext() est le moyen recommandé d'obtenir le contexte pour non nullable dans Kotlin, en fragments. Cela ne signifie pas qu'il n'est pas nullable, le Context peut toujours se terminer par null. Ce que fait la fonction est de lever une exception si est null, c'est pourquoi vous pouvez l'utiliser comme si n'était pas null. L'exception n'est généralement jamais levée et si cela se produit, c'est parce qu'elle a été utilisée avant ou après la disponibilité de Context, donc l'utilisation de context!! aurait également planté.

L'utilisation de activity!!.applicationContext fonctionnerait également, mais il s'agit d'un transtypage vers non nullable à partir d'un nullable et n'est donc pas recommandé.

Ceci est très similaire à requireActivity()

La dernière chose que vous pourriez essayer est d'utiliser this qui serait le Fragment, malheureusement vous ne pouvez pas

val context: Context = this

Ce ne serait pas nul car le fragment n'est pas nul si fait quelque chose, mais le fragment ne s'étend pas de Context comme le font les activités (si vous suivez l'héritage du contexte pour les activités, les 3 parents supérieurs sont ContextThemeWrapper, ContextWrapper et Context)

2
cutiko 14 nov. 2020 à 15:42