
Ciemny motyw jest dostępny na Androidzie 10 (poziom interfejsu API 29) i nowszych. Zapewnia ona te korzyści:
- Znacznie zmniejsza zużycie energii w zależności od technologii ekranów.
- Poprawia widoczność dla użytkowników niedowidzących i wrażliwych na jasne światło.
- Ułatwia korzystanie z urządzenia przy słabym oświetleniu.
Ciemny motyw dotyczy interfejsu systemu Android i aplikacji uruchomionych na urządzeniu.
Tryb ciemny można włączyć na Androidzie 10 i nowszych na 3 sposoby:
- Aby użyć ustawienia systemowego, otwórz Ustawienia > Wyświetlacz > motyw, aby włącz ciemny motyw.
- Kafelek Szybkie ustawienia pozwala przełączać motywy z panelu powiadomień gdy ta opcja jest włączona.
- Na urządzeniach Pixel włącz tryb oszczędzania baterii, aby jednocześnie włączyć ciemny motyw. Inne urządzenia mogą nie obsługiwać tej funkcji.
Instrukcje stosowania ciemnego motywu do treści internetowych za pomocą komponentu WebView przeczytaj artykuł Przyciemnianie treści internetowych w komponencie WebView.
Obsługa ciemnego motywu w aplikacji
Aby włączyć obsługę ciemnego motywu, ustaw motyw aplikacji – zwykle znajduje się on
res/values/styles.xml
– aby dziedziczyć z motywu DayNight
:
<style name="AppTheme" parent="Theme.AppCompat.DayNight">
Możesz też użyć ciemnego motywu Material Komponenty motyw:
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
Dzięki temu główny motyw aplikacji jest powiązany z flagami trybu nocnego kontrolowanymi przez system, a po włączeniu ciemny motyw jest domyślnie stosowany w aplikacji.
Motywy i style
Unikaj stosowania na stałe kolorów lub ikon przeznaczonych do użytku z jasnym motywem. Zamiast tego użyj atrybutów motywu lub zasobów z kwalifikacją „nocna”.
W przypadku ciemnego motywu najważniejsze są 2 atrybuty motywu:
?android:attr/textColorPrimary
: kolor tekstu ogólnego. Jest niemal czarny w jasnym motywie i prawie biały w ciemnych motywach. zawiera stan wyłączony.?attr/colorControlNormal
: kolor ikony ogólnego przeznaczenia. Zawiera ona wyłączone.
Zalecamy korzystanie z komponentów Material Design, ponieważ ich system kolorów, np. atrybuty ?attr/colorSurface
i ?attr/colorOnSurface
, ułatwia dostęp do odpowiednich kolorów. Możesz dostosować te atrybuty w swoim motywie.
Zmień motywy w aplikacji
Możesz zezwolić użytkownikom na zmienianie motywu aplikacji, gdy jest ona uruchomiona. Poniżej są zalecane opcje:
- Jasny
- Ciemny
- Ustawienie domyślne systemu (zalecana opcja domyślna)
Te opcje są mapowane bezpośrednio na tryby AppCompat.DayNight
:
Światło:
MODE_NIGHT_NO
Ciemny:
MODE_NIGHT_YES
Ustawienie domyślne systemu:
MODE_NIGHT_FOLLOW_SYSTEM
.
Aby zmienić motyw:
Na poziomie interfejsu API 31 lub wyższym użyj
UiModeManager#setApplicationNightMode
aby poinformować system, jaki motyw jest uruchamiany w aplikacji. Dzięki temu system będzie pasował obok motywu wyświetlanego na ekranie powitalnym.W przypadku interfejsu API na poziomie 30 i niższym użyj
AppCompatDelegate.setDefaultNightMode()
aby przełączyć motyw.
Wymuś ciemny kolor
Android 10 udostępnia funkcję Wymuszenie ciemnego motywu, która pozwala deweloperom szybko implementować ciemny motyw bez konieczności jawnego ustawiania motywu DayNight
.
Funkcja wymuszania trybu ciemnego analizuje każdy widok aplikacji z jasnym motywem i stosuje ciemny motyw automatycznie, zanim zostanie wyświetlony na ekranie. Aby skrócić czas potrzebny na wdrożenie ciemnego motywu, możesz użyć mieszanki implementacji wymuszania ciemnego motywu i implementacji natywnej.
Aplikacje muszą zezwalać na wymuszenie ciemnego motywu, ustawiając wartość android:forceDarkAllowed="true"
w motywie aktywności. Ten atrybut jest ustawiony dla wszystkich tagów systemowych i
Jasne motywy udostępnione w Androidzie X, np. Theme.Material.Light
. Jeśli używasz opcji Wymuś ciemny motyw, dokładnie przetestuj aplikację i w razie potrzeby wyklucz widoki.
Jeśli aplikacja używa ciemnego motywu (np. Theme.Material
), tryb ciemny nie jest stosowany. Podobnie, jeśli motyw Twojej aplikacji dziedziczy z motywu DayNight
, tryb ciemny nie zostanie zastosowany z powodu automatycznego przełączania motywów.
Wyłączanie trybu ciemnego w danym widoku
Wymuszanie trybu ciemnego można ustawić w przypadku konkretnych widoków za pomocą
atrybutu układu android:forceDarkAllowed
lub z
setForceDarkAllowed()
Treści z internetu
Informacje o używaniu ciemnego motywu w treściach internetowych znajdziesz w artykule Ciemne kolory w komponencie WebView. Przykład ciemnego motywu zastosowanego w WebView znajdziesz w demo WebView na GitHubie.
Sprawdzone metody
W następnych sekcjach znajdziesz sprawdzone metody implementowania ciemnych motywów.
Powiadomienia i widżety
W przypadku interfejsów, które wyświetlasz na urządzeniu, ale nie kontrolujesz bezpośrednio, upewnij się, że widoki, których używasz, odzwierciedlają motyw aplikacji hosta. Dwa przykłady to powiadomienia i widżety uruchamiające.
Powiadomienia
Używaj szablonów powiadomień udostępnianych przez system, takich jak MessagingStyle
. Oznacza to, że system jest odpowiedzialny za zastosowanie prawidłowego stylu widoku.
Widżety i niestandardowe widoki powiadomień
W przypadku widżetów w wyszukiwarce lub jeśli Twoja aplikacja korzysta z niestandardowych widoków treści powiadomień przetestuj je w jasnym i ciemnym motywie.
Oto najczęstsze pułapki, na które należy zwrócić uwagę:
- Zakładamy, że kolor tła jest zawsze jasny
- Stałe kodowanie kolorów tekstu.
- Ustawienie zakodowanego na stałe koloru tła z domyślnym kolorem tekstu.
- używanie ikony, którą można narysować, w stałym kolorze.
W każdym z tych przypadków zamiast zakodowanych na stałe kolorów użyj odpowiednich atrybutów motywu.
ekrany uruchamiania,
Jeśli aplikacja ma niestandardowy ekran uruchamiania, być może trzeba go zmodyfikować, aby odzwierciedlał wybrany motyw.
Usuń wszystkie zakodowane na stałe kolory, takie jak kolory tła ustawione programowo na biały. Zamiast tego użyj atrybutu motywu ?android:attr/colorBackground
.
Zmiany konfiguracji
Gdy motyw aplikacji zmieni się (za pomocą ustawienia systemowego lub w aplikacji AppCompat),
wywołuje zdarzenie uiMode
zmiany konfiguracji. Oznacza to, że działania są automatycznie odtwarzane.
W niektórych przypadkach możesz chcieć, aby zmiana konfiguracji została przeprowadzona przez aplikację. Dla: możesz na przykład opóźnić zmianę konfiguracji, ponieważ film jest gra.
Aplikacja może obsługiwać implementację ciemnego motywu, deklarując, że każdy Activity
może obsługiwać zmianę konfiguracji uiMode
:
<activity
android:name=".MyActivity"
android:configChanges="uiMode" />
Gdy Activity
zadeklaruje, że obsługuje zmiany konfiguracji,
onConfigurationChanged()
jest wywoływana, gdy wystąpi zmiana motywu.
Aby sprawdzić, jaki jest bieżący motyw, aplikacje mogą uruchomić kod w takiej postaci:
val currentNightMode = configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK when (currentNightMode) { Configuration.UI_MODE_NIGHT_NO -> {} // Night mode is not active, we're using the light theme. Configuration.UI_MODE_NIGHT_YES -> {} // Night mode is active, we're using dark theme. }
int currentNightMode = configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK; switch (currentNightMode) { case Configuration.UI_MODE_NIGHT_NO: // Night mode is not active, we're using the light theme break; case Configuration.UI_MODE_NIGHT_YES: // Night mode is active, we're using dark theme break; }