androiddatekotlinandroid-datepickerdatepickerdialog

DatePicker dialog may showing improper date in kotlin


Below is the function I am using to diplay date picker dialog in 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()
    }

As above you can check that there are three arguments passed in this function.

I have to show the specific date in DatePicker dialog show I have passed this three parameters.

Means If User selected the date first time the default values will be set or the current date will be set.

If edittext has already a text selected and not empty am doing as below :

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()
                        )
                    }

But Still when the date picker dialogs opens its displaying the selected as as today instead of custom.

What might be the issue?

You can see I have also tried with updateDate() function as below :

dialog.updateDate(yearToDisplay,monthToDisplay,dayToDisplay)

Thanks.


Solution

  • Not completely sure about the updateDate method issue here . But to fix this you can use same Calendar object during initialization it should work fine . i have modified your method a bit .

    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()
        }
    }
    

    Now when you call it you just call it with a value you do mnot have to split String.

    openPurchaseDatePickerDialog(edtPurchaseDate.text.toString())