O implementacji widoków w Androidzie – DSP#06

Android posiada bardzo bogatą kolekcję wszelkiego rodzaju elementów interfejsu użytkownika: przyciski, pola tekstowe, checkboxy, przełączniki, to oczywiście te podstawowe, ale po za nimi występują konkretne widoki całego kalendarza, map, albo np web view – czyli wyświetlenie konkretnego kodu HTML. Wszystkie te widoki mają wspólną nadklasę, z której ja również skorzystam tworząc swoją bibliotekę.

Najkrócej wprowadzając w podstawy, w androidzie rozróżniamy aktywności (dziedziczące po klasie activity i pochodnych), w których znajduje się minimum metoda onCreate(..):

To aktywność jest najczęściej uruchamiana po starcie aplikacji, to ona decyduje który widok wyświetlić. Widoki, dziedziczące po klasie View, tutaj musimy po prostu nadpisać konstruktory. To na tym dzisiaj się skupię, ponieważ udało mi się zaimplementować w bibliotece, oraz uruchomić w aplikacji pierwszy, podstawowy widok, który wyświetla aktualny czas w milisekundach.

Widok, to podstawowy „składnik” dla wszystkich elementów interfejsu w Androidzie. Widoki są zbierane przez grupy widoków ViewGroups , które z kolei są bazą dla layout’ów. Ok, łatwiej to wyjaśnić rysunkiem niż słownie.

Tworzony przeze mnie DayView również dziedziczy po klasie View. A żeby cokolwiek się w nim znalazło należy przeciążyć metodę onDraw(..), ale może najpierw o konstruktorach.

Tak wyglądają w moim kodzie, pierwszy z nich przyjmuje oczywiście kontekst aplikacji, drugi kontekst i parametry które mogą dotyczyć jego wyglądu i mogą być zdefiniowane w pliku layoutu, jest wywoływany kiedy widok jest łączony ze swoją reprezentacją w xmlu (przyda się to później, kiedy będziemy mieli  kolor tekstu, etc podane w pliku z wyglądem naszego okna).

A teraz co nieco o metodzie onDraw(..), po pierwsze przyjmuje ona parametr Canvas który jest „płótnem” na którym możemy rysować korzystając z metod typu drawOval(..), drawRect(..) i podobnych. Do rysowania potrzebujemy jeszcze obiektu typu Paint który przechowuje nam kolory, rozmiary, kształty, dzięki którym możemy rysować. A teraz kodzik z tego co udało się do tej pory zrobić:

Tak naprawdę powyższy kod oznacza rysowanie tekstu na środku płótna, i zostanie pewnie zastąpiony w bardziej logiczny sposób, ale czemu on taki pokręcony? Cóż, android czasem miewa implementacje, w których ot tak wprost nie da się wyśrodkować czegoś na ekranie. Rozwiązanie problemu pochodzi ze stackOverflow gdzie zostało dobrze opisane, ja je tylko przełożyłem na Kotlina.

Pozostałymi rzeczami które zrobiłem w projekcie jest podłączenie biblioteki do aplikacji, ponieważ jeszcze nie została opublikowana, to nie było akurat specjalnie trudne, wymagało jednej linii:

W pliku build.gradle w module app. Potem mogłem dodać już mój widok z modułu dayview, wygląda on tak:

I oczywiście skorzystać z tego identyfikatora w aktywności, tak wygląda aktywność po wywaleniu zbędnych opcji:

Całość została zaccomitowana jako „first simple view”.

Kolejnym krokiem będzie stworzenie zdecydowanie ładniejszego wyglądu kartki z kalendarza, a także projekt API z którego będziemy docelowo korzystać.