Kotlin - 日期选择器对话框 - 如何在日期选择器对话框中显示先前选择的日期

时间:2021-05-24 06:37:30

标签: android kotlin android-datepicker datepickerdialog

我有两个文本视图可以在 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 对话框应打开并选择相同的日期。

我需要改变哪些地方才能实现这一目标?

谢谢。

3 个答案:

答案 0 :(得分:1)

您可以使用 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.MONTH], calendar[Calendar.DAY_OF_MONTH])
        } catch (e: ParseException) {
            e.printStackTrace()
        }
    } 

答案 1 :(得分:1)

您创建 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]
)

答案 2 :(得分:0)

问题是您总是重新创建 openDatePickerDialog,因此会创建对话框的新实例。当前实例没有提供给前一个对话框实例的数据。因此,您可以将日期选择器对话框设为单个实例,也可以将所选日期存储在全局变量中。

如果你想在不修改当前对话框的情况下实现。您需要将日期数据存储在全局变量中,而不是像这样存储来自日期集侦听器的日期数据

        calendar[Calendar.YEAR] = year
        calendar[Calendar.MONTH] = month
        calendar[Calendar.DAY_OF_MONTH] = day_of_month

您可以像这样创建 3 个全局变量 day,month,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, { _, year, month, 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()
            }
        }
    }, year, month, 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()
}
相关问题