Android 单击一次编辑文本后显示DatePickerDialog和TimePickerDialog
在AndroidViewModel上单击EditText后,我尝试显示DataPickerDialog和TimePickerDialogAndroid 单击一次编辑文本后显示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
// 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()
}
}