Android - Как вы извлекаете Неделю года из onDateChangedListener? - PullRequest
0 голосов
/ 30 марта 2019

Я немного рассол.Я создаю приложение, в котором я отображаю номер дня, месяца, года и недели из DatePicker.Когда дата выбрана, дата и номер недели должны отображаться на экране.Мне удалось отобразить правильную дату, но я изо всех сил пытаюсь отобразить номер недели

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    BottomNavigationView bottomNav = findViewById(R.id.bottom_navigation);
    bottomNav.setOnNavigationItemSelectedListener(navListener);

    datePicker = (DatePicker) findViewById(R.id.kalender);
    datoText = (TextView) findViewById(R.id.kalenderText);
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());

    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH);
    int day = calendar.get(Calendar.DAY_OF_MONTH);
    final int week = calendar.get(Calendar.WEEK_OF_YEAR);

    datePicker.init(year, month, day, new DatePicker.OnDateChangedListener() {
        @Override
        public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
            String dato = dayOfMonth + " / " + (monthOfYear + 1) + " / " + year;
            datoText.setText(dato);
        }
    });

Итак, мой вопрос заключается в следующем: Как я могу отобразить номер недели выбранной даты?

1 Ответ

1 голос
/ 30 марта 2019

Даже если вы не хотите отображать номер недели, вам следует использовать форматтер для форматирования даты для отображения. Это, в свою очередь, позаботится и о номере недели. Я предлагаю вам объявить форматер константой в вашем классе:

private static final DateTimeFormatter DATE_FORMATTER
        = DateTimeFormatter.ofPattern("d/M/u 'Uke' w", Locale.forLanguageTag("no"));

Теперь все остальное довольно просто:

    @Override
    public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        LocalDate dato = LocalDate.of(year, monthOfYear + 1, dayOfMonth);
        datoText.setText(dato.format(DATE_FORMATTER));
    }

Это покажет строку как 2/4/2019 Uke 14. Вы можете адаптировать строку шаблона формата к желаемому выводу. Буквы, которые не следует интерпретировать как буквы шаблона формата, заключаются в одинарные кавычки (апострофы), например, 'Uke'.

Я использую java.time, современный Java-интерфейс даты и времени.

Вопрос: Могу ли я использовать java.time на Android?

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

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

Если вы не можете позволить себе внешнюю зависимость (даже для надежной библиотеки и библиотеки, ориентированной на будущее), старомодный SimpleDateFormat можно использовать аналогичным образом, но только после того, как вы сначала преобразовали выбранные значения в Calendar и затем Date. Имейте в виду, однако, что класс SimpleDateFormat общеизвестно проблематичен и также не безопасен для потоков.

Ссылки

...