问题描述
我有两个文本视图可以在 Android 的 DatePicker 对话框中设置日期。
我已经完成了 startDate(From Date) 和 endDate(To Date) 的验证,如下所示:
/**
* Dialog for selecting custom date.
* */
private fun openDatePickerDialog(view: TextView,dateType: String) {
activity?.let { KeyboardUtils.hideKeyboard(it) }
val calendar = Calendar.getInstance()
val dialog = DatePickerDialog(activity,{ _,year,month,day_of_month ->
calendar[Calendar.YEAR] = year
calendar[Calendar.MONTH] = month
calendar[Calendar.DAY_OF_MONTH] = day_of_month
Log.e(">>>>>>>>>> ",">>>>>>>>>> else")
val myFormat = OverAllAppDatedisplayFormat
val sdf = SimpleDateFormat(myFormat,Locale.getDefault())
view.text = sdf.format(calendar.time).toString()
when (dateType) {
"from" -> {
filterDateFrom = view.text.toString()
}
"to" -> {
filterDateto = view.text.toString()
}
}
},calendar[Calendar.YEAR],calendar[Calendar.MONTH],calendar[Calendar.DAY_OF_MONTH])
if (view.id == R.id.tvDateto && filterDateFrom.isNotEmpty() && filterDateFrom.contains("-")) {
val sdf = SimpleDateFormat(OverAllAppDatedisplayFormat)
try {
val mDate = sdf.parse(filterDateFrom)
dialog.datePicker.minDate = mDate.time
dialog.datePicker.maxDate = calendar.timeInMillis
} catch (e: ParseException) {
e.printstacktrace()
}
} else if (view.id == R.id.tvDateFrom && filterDateto.isNotEmpty() && filterDateto.contains("-")) {
val sdf = SimpleDateFormat(OverAllAppDatedisplayFormat)
try {
val mDate = sdf.parse(filterDateto)
dialog.datePicker.maxDate = mDate.time
} catch (e: ParseException) {
e.printstacktrace()
}
} else {
//by default max date
dialog.datePicker.maxDate = calendar.timeInMillis
}
dialog.show()
}
现在我想打开这个对话框,在特定的文本视图上设置最后一个日期, 即如果在 textView 上设置了 24-05-2021,则 datePicker 对话框应打开并选择相同的日期。
我需要改变哪些地方才能实现这一目标?
谢谢。
解决方法
您可以使用 updateDate 方法更新 DatePicker 的日期。
只需像下面这样更改您的代码
if (view.id == R.id.tvDateTo && filterDateFrom.isNotEmpty() && filterDateFrom.contains("-")) {
val sdf = SimpleDateFormat(OverAllAppDateDisplayFormat)
try {
val mDate = sdf.parse(filterDateFrom)
dialog.datePicker.minDate = mDate.time
dialog.datePicker.maxDate = calendar.timeInMillis
//New Code
val calendar = Calendar.getInstance()
calendar.time = mDate
dialog.datePicker.updateDate(calendar[Calendar.YEAR],calendar[Calendar.MONTH],calendar[Calendar.DAY_OF_MONTH])
} catch (e: ParseException) {
e.printStackTrace()
}
} else if (view.id == R.id.tvDateFrom && filterDateTo.isNotEmpty() && filterDateTo.contains("-")) {
val sdf = SimpleDateFormat(OverAllAppDateDisplayFormat)
try {
val mDate = sdf.parse(filterDateTo)
dialog.datePicker.maxDate = mDate.time
//New Code
val calendar = Calendar.getInstance()
calendar.time = mDate
dialog.datePicker.updateDate(calendar[Calendar.YEAR],calendar[Calendar.DAY_OF_MONTH])
} catch (e: ParseException) {
e.printStackTrace()
}
}
,
您创建 DatePickerDialog 的方法是正确的。您正在使用 this 构造函数在日期选择器打开后预先选择您的日期,但您的日历实例是错误的。
您使用的 val calendar = Calendar.getInstance()
基本上表示当前时间戳。为了显示选定的时间,您需要先操作日历实例以设置日期,然后再将其传递给日期选择器对话框。
以下是正确的代码片段:
val calendar = Calendar.getInstance()
calendar[Calendar.YEAR] = year // set your year to pre-select it on dialog
calendar[Calendar.MONTH] = month // set your month to pre-select it on dialog
calendar[Calendar.DAY_OF_MONTH] = day_of_month // set your day to pre-select it on dialog
val dialog = DatePickerDialog(
activity,{ _,year,month,day_of_month -> },calendar[Calendar.YEAR],// Using the same calendar instance here as above will do the trick
calendar[Calendar.MONTH],calendar[Calendar.DAY_OF_MONTH]
)
,
问题是您总是重新创建 openDatePickerDialog,因此会创建对话框的新实例。当前实例没有提供给前一个对话框实例的数据。因此,您可以将日期选择器对话框设为单个实例,也可以将所选日期存储在全局变量中。
如果你想在不修改当前对话框的情况下实现。您需要将日期数据存储在全局变量中,而不是像这样存储来自日期集侦听器的日期数据
calendar[Calendar.YEAR] = year
calendar[Calendar.MONTH] = month
calendar[Calendar.DAY_OF_MONTH] = day_of_month
您可以像这样创建 3 个全局变量 day,year
并存储来自日期集侦听器的数据
this.year = year
this.month = month
this.day = day_of_month
并在创建对话框时使用新创建的变量作为日期数据,以在日期选择器对话框中显示数据之前的日期数据。
因此最终代码将如下所示
var day = -1
var year = -1
var month = -1
private fun openDatePickerDialog(view: TextView,dateType: String) {
activity?.let { KeyboardUtils.hideKeyboard(it) }
val calendar = Calendar.getInstance()
if (day==-1 && month==-1 && year == -1) {
year = calendar.get(Calendar.YEAR)
month = calendar.get(Calendar.MONTH)
day = calendar.get(Calendar.DAY_OF_MONTH)
}
val dialog = DatePickerDialog(activity,day_of_month ->
this.year = year
this.month = month
this.day = day_of_month
Log.e(">>>>>>>>>> ",">>>>>>>>>> else")
val myFormat = OverAllAppDateDisplayFormat
val sdf = SimpleDateFormat(myFormat,Locale.getDefault())
view.text = sdf.format(calendar.time).toString()
when (dateType) {
"from" -> {
filterDateFrom = view.text.toString()
}
"to" -> {
filterDateTo = view.text.toString()
}
}
},day)
if (view.id == R.id.tvDateTo && filterDateFrom.isNotEmpty() && filterDateFrom.contains("-")) {
val sdf = SimpleDateFormat(OverAllAppDateDisplayFormat)
try {
val mDate = sdf.parse(filterDateFrom)
dialog.datePicker.minDate = mDate.time
dialog.datePicker.maxDate = calendar.timeInMillis
} catch (e: ParseException) {
e.printStackTrace()
}
} else if (view.id == R.id.tvDateFrom && filterDateTo.isNotEmpty() && filterDateTo.contains("-")) {
val sdf = SimpleDateFormat(OverAllAppDateDisplayFormat)
try {
val mDate = sdf.parse(filterDateTo)
dialog.datePicker.maxDate = mDate.time
} catch (e: ParseException) {
e.printStackTrace()
}
} else {
//by default max date
dialog.datePicker.maxDate = calendar.timeInMillis
}
dialog.show()
}