Отображать даты из DatePickerDialog проще - PullRequest
0 голосов
/ 19 сентября 2019

Теперь отобразите дату следующим образом:

    val calendar = Calendar.getInstance()
    val currentYear = calendar.get(Calendar.YEAR)
    val currentMonth = calendar.get(Calendar.MONTH)
    val currentDay = calendar.get(Calendar.DAY_OF_MONTH)

    pickDate.setOnClickListener {
        val datePickDialog = DatePickerDialog(
            activity,
            DatePickerDialog.OnDateSetListener { view, year, month, dayOfMonth ->
                val dateFormat = SimpleDateFormat("d MMMM yyyy")
                calendar.set(year, month, dayOfMonth)
                val dateString = dateFormat.format(calendar.time)
                currentDateView.text = dateString
            },
            currentYear,
            currentMonth,
            currentDay
        )
        datePickDialog.show()
    }

Можно сделать как проще?

1 Ответ

1 голос
/ 20 сентября 2019

Это нельзя сделать намного проще.Два предложения по упрощению:

  1. Используйте java.time, современный Java-интерфейс даты и времени.В этом случае мы заменяем два старых класса Calendar и Date только одним новым классом LocalDate.Так что это спасает нас от конверсии.Кроме того, используемые вами классы давно устарели, и, как правило, с java.time работать гораздо приятнее.
  2. Используйте встроенный локализованный формат даты для локали пользователя, а не для записи строки шаблона формата.Последний, как правило, подвержен ошибкам, и использование встроенного формата намного лучше подходит для интернационализации.

Приведенный ниже код не тестируется, возможно, есть опечатка или два, но вы должны получитьИдея.

    val date = LocalDate.now(ZoneId.of("Africa/Abidjan"))
    val currentYear = date.year
    val currentMonth = date.monthValue
    val currentDay = date.dayOfMonth

    val dateFormatter = DateTimeFormatter.ofLocalizedDate(TextStyle.MEDIUM)

    pickDate.setOnClickListener {
        val datePickDialog = DatePickerDialog(
            activity,
            DatePickerDialog.OnDateSetListener { view, year, month, dayOfMonth ->
                val selectedDate = LocalDate.of(year, month + 1, dayOfMonth)
                val dateString = selectedDate.format(dateFormatter)
                currentDateView.text = dateString
            },
            currentYear,
            currentMonth - 1,
            currentDay
        )
        datePickDialog.show()
    }

Укажите желаемый часовой пояс, в который я поместил Африку / Абиджан.Используйте ZoneId.systemDefault для часового пояса по умолчанию (это то, что использовал код в вашем вопросе).Я также вынул форматтер из прослушивателя событий.Нет необходимости каждый раз создавать новый форматер.

Вопрос: Могу ли я использовать java.time на Android?Я в проекте использую мин API 21

Да, java.time прекрасно работает на старых и новых устройствах Android.Для этого требуется как минимум Java 6 .

  • В Java 8 и более поздних версиях и на более новых устройствах Android (от уровня API 26) современный API поставляется встроенным.
  • В Java 6 и 7 получают ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. Ссылки внизу).
  • На (более старых) Android используется версия ThreeTen для AndroidBackport.Это называется ThreeTenABP.И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Ссылки

...