Android 单击一次编辑文本后显示DatePickerDialog和TimePickerDialog

Android 单击一次编辑文本后显示DatePickerDialog和TimePickerDialog,android,android-datepicker,android-timepicker,Android,Android Datepicker,Android Timepicker,在AndroidViewModel上单击EditText后,我尝试显示DataPickerDialog和TimePickerDialog // fragment // in TestFragment // pass the `requireActivity().application` to TextViewModel // viewModel class TestViewModel( application: Application, ) : AndroidViewModel(a

在AndroidViewModel上单击EditText后,我尝试显示DataPickerDialog和TimePickerDialog

// 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(数据绑定)


但是,当我单击此编辑文本时,它会报告一个错误,表明在显示这两个对话框时活动已消失

android.view.WindowManager$BadTokenException:无法添加窗口--标记null无效;你的活动正在进行吗

原因在于环境。 对话框的上下文必须是活动,而不是应用程序。 将应用程序上下文设置为对话框将导致WindowManger$BadTokenException。

原因是上下文。
import android.app.Application
import androidx.lifecycle.AndroidViewModel

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

    private val context = getApplication<Application>().applicationContext  
     ........
} 
对话框的上下文必须是活动,而不是应用程序。
将应用程序上下文设置为dialog将导致WindowManger$BadTokenException。

侧面建议:使用TextView作为日期选择器和时间选择器对话框的触发器,而不是EditText。关于您的问题,请检查
getApplication()
是否不为null,这很可能是原因所在。或者您可以传递一个上下文。附带建议:不要使用EditText,而是使用TextView作为DatePicker和TimePicker对话框的触发器。关于您的问题,请检查
getApplication()
是否不为null,这很可能是原因。或者您可以传递一个上下文。我直接通过viewModel工厂来创建viewModel的上下文可以是工作上下文。我直接通过viewModel工厂来创建viewModel的上下文可以是工作上下文。
import android.app.Application
import androidx.lifecycle.AndroidViewModel

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

    private val context = getApplication<Application>().applicationContext  
     ........
} 
 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()
    }
}