Generowanie nazw dni i miesięcy

W pewnym momencie gdy piszemy aplikacje na system android spotykamy się z kalendarzem tzn. musimy wyświetlić nazwy dni tygodnia lub miesięcy. Oczywiście możemy wyświetlić takie informacje w postaci liczb co niekoniecznie to estetycznie ładnie wygląda. Innym rozwiązaniem jest przypisanie stringów do dni tygodnia lub miesięcy i na tej podstawie prezentować datę (np: 28 stycznia 2017 roku). Jakieś to rozwiązanie na mniejszą skalę jest, ale też tutaj jest dużo zabawy. Kolejnym problemem jest to, że jeżeli mamy aplikację w kilku językach to te nazwy musimy tłumaczyć… A co powiesz na to aby takie nazwy wygenerować automatycznie i przy tym same się tłumaczyły? Właśnie ten wpis pokaże Ci w jaki sposób możesz to osiągnąć i generować nazwy dni i miesięcy oraz zostanie to automatycznie przetłumaczone na każdy język. Zapraszam do lektory 🙂

1. Formatowanie daty – SimpleDateFormat

SimpleDateFormat to klasa która umożliwia nam formatowanie i analizowanie daty. Formatowanie daty może odbywać się w 2 strony, z tekstu (String) -> do daty (Date) oraz z daty do tekstu.  Dodatkowo ta klasa posiada dodatkowy argument gdzie jest to wzorzec za pomocą którego zostanie utworzony nowy sposób zapisu daty. W naszym przypadku interesuję nas tylko 3 wzorce są to litery: E, L, M.
Dla dni (E) reprezentacja wygląda następująco:

  • EEEE’ – dzień w postaci nazwy np. „poniedziałek”
  • EE’ – dzień w postaci nazwy np. „pon”.

Dla miesiąca (M) reprezentacja wygląda następująco:

  • M’ => miesiąc w postaci jednocyfrowej np. 1
  • MM’ => miesiąc w postaci dwucyfrowej np. 01
  • MMM’ => miesiąc w postaci skróconej nazwy np. „sty”
  • MMMM’ => miesiąc w postaci nazwy np. „stycznia”.

stycznia„, a czemu nie styczeń? Ponieważ wszystkie nazwy są w dopełniaczu. Aby zrobić nazwy w mianowniku „Stycznia” zamiast literki „MMMM” stosujemy „LLLL” i wszystko śmiga. Czy jest możliwość odmiany na inne przypadki np: styczniu? Na chwilą obecną nie (albo ja nie znam sposobu aby to zrobić automatycznie) pewnie dlatego, że mało to się używa… W tym przypadku trzeba by było skorzystać ze stringów.
SimpleDateFormat trochę już poznaliśmy teraz czas na napisanie metody. Przykładowy kod dla generowanie dni tygodnia może wyglądać następująco:

private String getDayNames(String pattern) {
    StringBuilder dayname = new StringBuilder()
    SimpleDateFormat dateFormat = new SimpleDateFormat( pattern, Locale.getDefault() );
    Calendar day = Calendar.getInstance();
    day.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
    for (int i = 0; i < 7; i++)
    {
        dayname.append("\n");
        dayname.append( dateFormat.format(day.getTime()) );
        day.add(Calendar.DAY_OF_WEEK, 1);
    }
    return dayname.toString();
}

Natomiast metoda dla generowanie nazw miesięcy może być taka:

private String getMonthNames(String pattern) {
    StringBuilder dayname = new StringBuilder();
    SimpleDateFormat dateFormat = new SimpleDateFormat( pattern, Locale.getDefault() );
    Calendar day = Calendar.getInstance();
    day.set(Calendar.MONTH, Calendar.JANUARY);
    for (int i = 0; i < 12; i++)
    {
        dayname.append("\n");
        dayname.append( dateFormat.format(day.getTime()) );
        day.add(Calendar.MONTH, 1);
    }
    return dayname.toString();
}

Za tłumaczenie odpowiada nam trzeci parametr czyli „Locale.getDefault()”. W androidzie działa to tak, jeżeli użytkownik będzie miał ustawiony polski język interfejsu to dostanie polskie nazwy itd. Jak z tego korzystać? Aby wyświetlić wszystkie nazwy dni piszemy coś takiego:

textView.setText( getMonthNames("LLLL") );

Oczywiście nic nie stoi na przeszkodzie aby modyfikować tą metodę. Zwróć uwagę na to, że powyższe metody zwracają wszystkie nazwy dni i miesięcy.

2.Podsumowanie.

Jak widać w łatwy sposób możemy generować nazwy dni i miesięcy oraz dodatkowo tłumaczyć. Poniżej możesz to zobaczyć jak to wygląda w aplikacji:

Co dalej?

  • Polub stronę MYENV na Facebooku oraz śledź mnie na Twitterze
  • Zachęcam do komentowania i pisania propozycji tematów, o których chcesz przeczytać
  • Poleć ten wpis za pomocą poniższych przycisków. Będę Ci za to bardzo wdzięczny 🙂
  • Życzę Ci miłego dnia i miłego kodowania 🙂