Ниже приведена функция, которую я использую для отображения диалогового окна выбора даты в Android.

private fun openPurchaseDatePickerDialog(
    yearToDisplay: Int,
    monthToDisplay: Int,
    dayToDisplay: Int
) {
    try {
        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
            val myFormat = "" + DateUtils.OverAllAppDateDisplayFormat
            val sdf = SimpleDateFormat(myFormat, Locale.getDefault())
            edtPurchaseDate.setText(sdf.format(calendar.time).toString())
            spIntendedUse.isFocusable = true
        }, yearToDisplay, monthToDisplay, dayToDisplay)
        dialog.updateDate(yearToDisplay,monthToDisplay,dayToDisplay)
        dialog.datePicker.maxDate = calendar.timeInMillis
        dialog.show()
    } catch (e: Exception) {
        e.printStackTrace()
    }

Как и выше, вы можете проверить, что этой функции переданы три аргумента.

Я должен показать конкретную дату в диалоговом окне DatePicker. Я передал эти три параметра.

Означает, что если пользователь выбрал дату в первый раз, будут установлены значения по умолчанию или будет установлена ​​текущая дата.

Если в edittext уже выделен текст, а не пустой, я делаю, как показано ниже:

if (edtPurchaseDate.text.toString().isNullOrEmpty()) {
                        val calendar = Calendar.getInstance()
                        openPurchaseDatePickerDialog(
                            calendar[Calendar.YEAR],
                            calendar[Calendar.MONTH],
                            calendar[Calendar.DAY_OF_MONTH]
                        )
                    } else {
                        var dateArr = edtPurchaseDate.text.toString().split("-")
                        openPurchaseDatePickerDialog(
                            dateArr[2].toInt(),
                            dateArr[1].toInt(),
                            dateArr[0].toInt()
                        )
                    }

Но все же, когда открывается диалоговое окно выбора даты, в нем отображается выбранный как сегодня, а не пользовательский.

В чем может быть проблема?

Как видите, я также пробовал использовать функцию updateDate(), как показано ниже:

dialog.updateDate(yearToDisplay,monthToDisplay,dayToDisplay)

Спасибо.

0
Jaimin Modi 26 Ноя 2021 в 14:37

1 ответ

Лучший ответ

Не совсем уверен в проблеме метода updateDate здесь. Но чтобы исправить это, вы можете использовать тот же объект Calendar во время инициализации, он должен работать нормально. Я немного изменил ваш метод.

private fun openPurchaseDatePickerDialog(date: String) {
    try {
        val calendar = Calendar.getInstance()
        if (date.isNotBlank()) {
           try {
               calendar.time = SimpleDateFormat("dd-MM-yyyy", Locale.getDefault()).parse(date)!!
           }catch (e:ParseException){
           }
        }
        val dialog = DatePickerDialog(this, { _, year, month, day_of_month ->
            calendar[Calendar.YEAR] = year
            calendar[Calendar.MONTH] = month
            calendar[Calendar.DAY_OF_MONTH] = day_of_month
            val myFormat = "dd-MM-yyyy"
            val sdf = SimpleDateFormat(myFormat, Locale.getDefault())
            edtPurchaseDate.setText(sdf.format(calendar.time).toString())
        }, calendar[Calendar.YEAR], calendar[Calendar.MONTH], calendar[Calendar.DAY_OF_MONTH])
        dialog.datePicker.maxDate = System.currentTimeMillis()
        dialog.show()
    } catch (e: Exception) {
        e.printStackTrace()
    }
}

Теперь, когда вы вызываете его, вы просто вызываете его со значением, которое вам не нужно разбивать на String.

openPurchaseDatePickerDialog(edtPurchaseDate.text.toString())
1
ADM 26 Ноя 2021 в 15:15
Ага. Выполнено. Спасибо. Как этот способ его достижения.
 – 
Jaimin Modi
26 Ноя 2021 в 15:53