J'ai essayé d'afficher DataPickerDialog et TimePickerDialog après avoir cliqué sur EditText sur AndroidViewModel.

// fragment

// in TestFragment
// pass the `requireActivity().application` to TextViewModel

// viewModel

class TestViewModel(
    application: Application,
) : AndroidViewModel(application) {
    ...
    fun showDateTimeDialog() {
        val currentDateTime = Calendar.getInstance()
        val startYear = currentDateTime.get(Calendar.YEAR)
        val startMonth = currentDateTime.get(Calendar.MONTH)
        val startDay = currentDateTime.get(Calendar.DAY_OF_MONTH)
        val startHour = currentDateTime.get(Calendar.HOUR_OF_DAY)
        val startMinute = currentDateTime.get(Calendar.MINUTE)
        DatePickerDialog(getApplication(), { _, year, month, day ->
            TimePickerDialog(getApplication(), { _, hour, minute ->
                val pickedDateTime = Calendar.getInstance()
                pickedDateTime.set(year, month, day, hour, minute)
            }, startHour, startMinute, false).show()
        }, startYear, startMonth, startDay).show()
    }
}

Xml (liaison de données)

        <EditText
            android:id="@+id/date_time_edit"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/add_date_time"
            android:importantForAutofill="no"
            android:ems="10"
            android:clickable="true"
            android:focusable="false"
            android:editable="false"
            android:onClick="@{() -> viewModel.showDateTimeDialog()}" />

Mais lorsque je clique sur ce EditText, il signale une erreur indiquant que l'activité a disparu tout en affichant ces deux boîtes de dialogue.

android.view.WindowManager $ BadTokenException: Impossible d'ajouter la fenêtre - le jeton null n'est pas valide; votre activité est-elle en cours?

1
ccd 23 sept. 2020 à 15:40

2 réponses

Meilleure réponse
import android.app.Application
import androidx.lifecycle.AndroidViewModel

class TestViewModel(application: Application) : AndroidViewModel(application) {

    private val context = getApplication<Application>().applicationContext  
     ........
} 

Puis passez le contexte

 fun showDateTimeDialog() {
        val currentDateTime = Calendar.getInstance()
        val startYear = currentDateTime.get(Calendar.YEAR)
        val startMonth = currentDateTime.get(Calendar.MONTH)
        val startDay = currentDateTime.get(Calendar.DAY_OF_MONTH)
        val startHour = currentDateTime.get(Calendar.HOUR_OF_DAY)
        val startMinute = currentDateTime.get(Calendar.MINUTE)
        DatePickerDialog(context, { _, year, month, day ->
            TimePickerDialog(context, { _, hour, minute ->
                val pickedDateTime = Calendar.getInstance()
                pickedDateTime.set(year, month, day, hour, minute)
            }, startHour, startMinute, false).show()
        }, startYear, startMonth, startDay).show()
    }
}
0
IntelliJ Amiya 23 sept. 2020 à 12:56

La cause est le contexte. Le contexte du dialogue doit être une activité plutôt qu'une application. Définir le contexte de l'application sur dialog provoquera l'exception WindowManger $ BadTokenException.

0
Cut Code 23 sept. 2020 à 12:48