微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我有两个文本视图可以在 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()
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?