Android od podstaw: tworzenie stylów i motywów
() translation by (you can also view the original English article)
Jako deweloperzy systemu Android, mamy tendencję do skupiania się przede wszystkim na funkcjonalności naszych aplikacji. Jednakże sama funkcjonalność rzadko wystarcza. W Google Play, który posiada dzisiaj ponad milion aplikacji, wygląd jest tak samo ważny jak funkcjonalność, jeśli nie ważniejszy. Jeśli trudno ci w to uwierzyć, proponuję przejrzeć aplikacje w sekcji Top listy w Google Play.
Istnieją dwa główne podejścia do modyfikowania wyglądu aplikacji na Androida. Pierwsze podejście polega na bezpośrednim modyfikowaniu właściwości widoków w plikach XML układu. Ten sposób jest sensowny tylko, jeśli pracujesz nad prostymi aplikacjami, które posiadają niewiele widoków i aktywności. Drugie podejście obejmuje stworzenie i wykorzystanie niestandardowych stylów i motywów. Jeśli masz doświadczenie w tworzeniu stron internetowych, pierwsze podejście jest zbliżone do stosowania stylów CSS, a drugie do arkuszy stylów.
W tym poradniku, dowiesz się jak stworzyć niestandardowe style i motywy dla aplikacji na Androida. Nauczysz się również jak korzystać z narzędzi i skrótów Android Studio w celu łatwiejszego tworzenia stylów.
1. Tworzenie stylów
Style nakłada się oczywiście na komponenty UI. W związku z tym, zacznijmy od stworzenia nowej pustej aktywności i dodania dwóch widoków do jej pliku XML układu.
1 |
<View android:layout_width="100dp" |
2 |
android:layout_height="100dp" |
3 |
android:layout_margin="5dp" |
4 |
android:background="#009688" |
5 |
android:id="@+id/box1" /> |
6 |
|
7 |
<View android:layout_width="100dp" |
8 |
android:layout_height="100dp" |
9 |
android:background="#00BCD4" |
10 |
android:layout_margin="5dp" |
11 |
android:id="@+id/box2" /> |
Jak widzisz w powyższym kodzie, właściwości takie jak layout_width
i layout_margin
są wyraźnie uwzględnione w definicji każdego widoku.
Aby stworzyć nowy styl dla pierwszego widoku, kliknij prawym klawiszem myszy i wybierz Refactor > Extract > Style.
Pojawi się komunikat, gdzie możesz nazwać styl oraz wybrać atrybuty, które powinny być w nim zawarte. Nazwij go MyBox i zaznacz wszystkie atrybuty z wyjątkiem background
.



Kiedy naciśniesz OK, zobaczysz, że kod pierwszego widoku uległ zmianie.
1 |
<View android:background="#009688" |
2 |
android:id="@+id/box1" |
3 |
style="@style/MyBox" /> |
Teraz widok posiada atrybut style
, który wskazuje na styl MyBox
. Możesz przyjrzeć się definicji stylu otwierając res/values/styles.xml.
1 |
<style name="MyBox"> |
2 |
<item name="android:layout_width">100dp</item> |
3 |
<item name="android:layout_height">100dp</item> |
4 |
<item name="android:layout_margin">5dp</item> |
5 |
</style>
|
Po stworzeniu stylu, można go nałożyć na dowolny widok. Dla przykładu, oto jak zastosować MyBox
w drugim widoku:
1 |
<View android:background="#00BCD4" |
2 |
android:id="@+id/box2" |
3 |
style="@style/MyBox" /> |
Po nałożeniu stylów, tak będą wyglądać oba widoki w aktywności:



2. Rozszerzanie stylów
Android pozwala na stworzenie stylów, które wykorzystują inne jako podstawę. Innymi słowy, umożliwia rozszerzanie istniejących stylów.
Wyróżniamy dwie składnie, które możesz użyć do rozszerzenia stylu. Pierwsza składnia, często nazywana domniemaną, korzysta z notacji kropek. Dla przykładu, oto jak stworzyć dwa pochodne style o nazwie TEAL i CYAN za pomocą MyBox
jako stylu nadrzędnego:
1 |
<style name="MyBox.TEAL"> |
2 |
<item name="android:background">#009688</item> |
3 |
</style>
|
4 |
|
5 |
<style name="MyBox.CYAN"> |
6 |
<item name="android:background">#00BCD4</item> |
7 |
</style>
|
Jak zapewne się domyślasz, MyBox.TEAL
i MyBox.CYAN
zawierają wszystkie właściwości MyBox
. Oprócz nich posiadają również właściwość android:background
.
Drugą składnię do tworzenia pochodnych stylów zazwyczaj określa się jako jednoznaczną. Obejmuje ona wykorzystanie atrybutu parent
, którego wartość jest ustawiona jako nazwa stylu nadrzędnego. Poniższy fragment kodu definiuje styl o nazwie TealBox.
1 |
<style name="TealBox" parent="MyBox"> |
2 |
<item name="android:background">#009688</item> |
3 |
</style>
|
Stosowanie pochodnych stylów nie różni się niczym od stosowania tych zwykłych.
1 |
<View android:id="@+id/box1" |
2 |
style="@style/TealBox" /> |
3 |
|
4 |
<View android:id="@+id/box2" |
5 |
style="@style/MyBox.CYAN" /> |
Większość deweloperów korzysta z domniemanych składni podczas rozszerzania własnych stylów i jednoznacznych składni podczas rozszerzania stylów platformy Android.
3. Tworzenie motywów
Dotychczas nakładaliśmy style na widoki znajdujące się wewnątrz aktywności. Android pozwala również na zastosowanie stylów dla całych aktywności i aplikacji. Po nałożeniu stylu na aktywność lub aplikacje, staje się on motywem.
Domyślnie, wszystkie aplikacje stworzone za pomocą ostatniej wersji Android Studio korzystają z motywu o nazwie AppTheme
. AppTheme
jest potomkiem dobrze znanego motywu AppCompat, ogromnego i bardzo wszechstronnego motywu, który może mieć wpływ na wygląd prawie każdego powszechnie używanego widoku.
Możesz znaleźć definicję AppTheme
w styles.xml:
1 |
<!-- Base application theme. -->
|
2 |
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> |
3 |
<item name="colorPrimary">@color/colorPrimary</item> |
4 |
<item name="colorPrimaryDark">@color/colorPrimaryDark</item> |
5 |
<item name="colorAccent">@color/colorAccent</item> |
6 |
</style>
|
AppTheme wywodzi się z Material Design. W związku z tym, aby stworzyć własny motyw zgodny ze specyfikacją Material Design, dobrym pomysłem jest wykorzystanie AppTheme
jako podstawy. Ewentualnie można bezpośrednio użyć Theme.AppCompat
jako obiektu nadrzędnego.
Chociaż zawsze możesz stworzyć motyw pisząc kod XML—pamiętaj, to są tylko style—w tym poradniku pokażę ci jak wykorzystać Theme Editor programu Android Studio, który wykona całą robotę za ciebie.
Aby otworzyć Theme Editor, otwórz menu Tools i wybierz Android > Theme Editor.
Po prawej stronie okna Theme Editor znajdują się kontrolki służące nie tylko modyfikowania motywów, ale też do tworzenia nowych. Po lewej stronie można zobaczyć podgląd zmian wprowadzonych w motywach.



Aby stworzyć nowy motyw, kliknij rozwijane menu Theme i wybierz opcję Create New Theme.
W nowym oknie, nazwij nowy motyw MyTheme i naciśnij OK.



Na tym etapie, style.xml otrzyma nowy wiersz, który wygląda tak:
1 |
<style name="MyTheme" parent="AppTheme" /> |
Zmodyfikujmy teraz MyTheme
za pomocą Theme Editor. Aby nie komplikować, w tym poradniku zmodyfikujemy tylko wartości atrybutów colorPrimary
, colorPrimaryDark
, i colorAccent
.
Aby zmienić wartość colorPrimary
, kliknij przycisk colorPrimary. Theme Editor wyświetli komunikat umożliwiający wybranie koloru. Wybierz dowolny kolor, ale najpierw nadaj mu nową nazwę. Jeśli tego nie zrobisz, Theme Editor nadpisze kolor używany przez AppTheme
.



Wykonaj te same czynności, aby zmienić wartości colorPrimaryDark
i colorAccent
. Theme Editor automatycznie użyje wybranego koloru dla colorPrimary
, aby zasugerować odpowiednie kolory dla colorPrimaryDark
and colorAccent
.
Definicja MyTheme
będzie wyglądała w ten sposób:
1 |
<style name="MyTheme" parent="AppTheme" > |
2 |
<item name="colorPrimary">@color/colorPrimaryMyTheme</item> |
3 |
<item name="colorPrimaryDark">@color/colorPrimaryDarkMyTheme</item> |
4 |
<item name="colorAccent">@color/colorAccentMyTheme</item> |
5 |
</style>
|
4. Stosowanie motywów
Przed zastosowaniem utworzonego przez nas motywu, dodajmy do aktywności kilka powszechnie używanych widoków. W ten sposób, łatwiej będzie nam zauważyć zmiany w motywie.
Poniższy kod tworzy zwykły, bez obramowania i kolorowy Button
, Checkbox
, RadioButton
, Switch
, Seekbar
, TextView
i EditText
.
1 |
<Button android:layout_width="match_parent" |
2 |
android:layout_height="wrap_content" |
3 |
android:text="normal" |
4 |
android:id="@+id/normal_button" /> |
5 |
|
6 |
<Button android:layout_width="match_parent" |
7 |
android:layout_height="wrap_content" |
8 |
android:text="borderless" |
9 |
android:id="@+id/borderless_button" |
10 |
style="@style/Widget.AppCompat.Button.Borderless" /> |
11 |
|
12 |
<Button android:layout_width="match_parent" |
13 |
android:layout_height="wrap_content" |
14 |
android:text="colored" |
15 |
android:id="@+id/colored_button" |
16 |
style="@style/Widget.AppCompat.Button.Colored" /> |
17 |
|
18 |
<CheckBox android:layout_width="match_parent" |
19 |
android:layout_height="wrap_content" |
20 |
android:text="New CheckBox" |
21 |
android:id="@+id/checkBox" /> |
22 |
|
23 |
<RadioButton android:layout_width="match_parent" |
24 |
android:layout_height="wrap_content" |
25 |
android:text="New RadioButton" |
26 |
android:id="@+id/radioButton" /> |
27 |
|
28 |
<Switch android:layout_width="match_parent" |
29 |
android:layout_height="wrap_content" |
30 |
android:text="New Switch" |
31 |
android:id="@+id/switchButton" /> |
32 |
|
33 |
<SeekBar android:layout_width="match_parent" |
34 |
android:layout_height="wrap_content" |
35 |
android:id="@+id/seekBar" /> |
36 |
|
37 |
<TextView android:layout_width="match_parent" |
38 |
android:layout_height="wrap_content" |
39 |
android:text="New Text" |
40 |
android:id="@+id/textView" /> |
41 |
|
42 |
<EditText android:layout_width="match_parent" |
43 |
android:layout_height="wrap_content" |
44 |
android:id="@+id/editText" |
45 |
android:hint="Input" /> |
Po dodaniu nowych widoków, układ powinien wyglądać tak:



Jeśli przeczytałeś specyfikację Material Design, z pewnością wiesz, że aktywność obecnie korzysta z odcieni indygo dla colorPrimary
i colorPrimaryDark
. Dla colorAccent
, korzysta z odcienia różu. Są to domyślne kolory określone przez Android Studio. Możesz znaleźć ich odpowiedniki kodu hex w res/values/colors.xml projektu.
Aby zastosować MyTheme
, szablon stworzony w poprzednim kroku, otwórz plik manifestu projektu i dodaj atrybut android:theme
do definicji aktywności. Ustaw jego wartość na @style/MyTheme
.
1 |
<activity android:name=".MainActivity" |
2 |
android:theme="@style/MyTheme"> |
3 |
<intent-filter>
|
4 |
<action android:name="android.intent.action.MAIN" /> |
5 |
<category android:name="android.intent.category.LAUNCHER" /> |
6 |
</intent-filter>
|
7 |
</activity>
|
Podobnie możesz nałożyć motyw na całą aplikację ustawiając wartość atrybutu definicji aplikacji android:theme
na @style/MyTheme
.
Jeśli przyjrzysz się teraz swojej aktywności, powinna wyglądać zupełnie inaczej.



Podsumowanie
W tym poradniku, nauczyłeś się jak stworzyć i zastosować niestandardowe style i motywy Androida. Zachęcam do wykorzystania tej wiedzy do nadawania nowego wyglądu twoim aplikacjom. Jednakże, nie daj się ponieść emocjom—większość użytkowników systemu Android jest tak przyzwyczajona do Material Design, że odejście od jego wytycznych, może być dużym błędem.
Aby dowiedzieć się więcej o stylach i motywach, polecam przejrzenie przewodnika po stylach i motywach.