【问题标题】:Kotlin - Date Picker Dialog - How to show Previously selected date in Date Picker DialogKotlin - 日期选择器对话框 - 如何在日期选择器对话框中显示以前选择的日期
【发布时间】:2021-05-24 06:37:30
【问题描述】:

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

我需要在哪里改变才能实现这个目标?

谢谢。

【问题讨论】:

    标签: android kotlin android-datepicker datepickerdialog


    【解决方案1】:

    您创建 DatePickerDialog 的方法是正确的。一旦日期选择器打开但您的日历实例错误,您正在使用 this 构造函数预先选择您的日期。

    您使用的是val calendar = Calendar.getInstance(),它基本上表示当前时间戳。为了显示选定的时间,您需要先操作日历实例来设置日期,然后再将其传递给日期选择器对话框。

    以下是正确的代码 sn-p:

    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】:

      您可以使用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()
              }
          } 
      

      【讨论】:

        【解决方案3】:

        问题是您总是在重新创建 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()
        }
        

        【讨论】:

          猜你喜欢
          • 2023-03-03
          • 2014-03-23
          • 2023-03-07
          • 1970-01-01
          • 1970-01-01
          • 2018-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多