Theme.AppCompat służy do ustawiania motywu globalnego dla całej aplikacji. ThemeOverlay.AppCompat służy do zastępowania (lub „nakładania”) tego motywu dla określonych widoków, zwłaszcza paska narzędzi.
Spójrzmy na przykład, dlaczego jest to konieczne.
Motywy aplikacji z ActionBar
ActionBar jest zwykle wyświetlany w aplikacji. Mogę wybrać jego kolor, ustawiając colorPrimary
wartość. Jednak zmiana motywu zmienia kolor tekstu na ActionBar.
<style name="AppTheme" parent="Theme.AppCompat">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
Ponieważ moim podstawowym kolorem jest ciemnoniebieski, prawdopodobnie powinienem użyć jednego z motywów, który używa jasnego koloru tekstu na pasku akcji, ponieważ czarny tekst jest trudny do odczytania.
Ukrywanie ActionBar i używanie paska narzędzi
Cały sens używania Theme.AppCompat zamiast Theme.Material polega na tym, że możemy pozwolić starszym wersjom Androida na używanie naszego motywu Material Design. Problem polega na tym, że starsze wersje Androida nie obsługują ActionBar. Dlatego dokumentacja zaleca ukrywanie ActionBar i dodanie paska narzędzi do układu. Aby ukryć ActionBar, musimy użyć jednego z NoActionBar
motywów. Poniższe obrazy przedstawiają pasek narzędzi z ukrytym paskiem akcji.
Ale co, jeśli chcę coś takiego jak jasny motyw z DarkActionBar? Ponieważ muszę używać NoActionBar, to nie jest opcja.
Zastępowanie motywu aplikacji
Tutaj pojawia się ThemeOverlay. Mogę określić motyw Dark ActionBar w moim układzie XML paska Toolbar.
<android.support.v7.widget.Toolbar
...
android:background="?attr/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
To wreszcie pozwala nam uzyskać pożądany efekt. Motyw Dark.ActionBar nakłada się na motyw aplikacji Light na tę szczególną okazję.
- Motyw aplikacji:
Theme.AppCompat.Light.NoActionBar
- Motyw paska narzędzi:
ThemeOverlay.AppCompat.Dark.ActionBar
Jeśli chcesz, aby menu podręczne było lekkie, możesz dodać to:
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
Dalsze badanie
Nauczyłem się tego poprzez eksperymentowanie i czytanie poniższych artykułów.