W Androidzie 8.0 wprowadziliśmy nową architekturę informacji dla aplikacji Ustawienia, uproszczenie porządkowania ustawień i ułatwi użytkownikom szybko znaleźć ustawienia i dostosować swoje urządzenia z Androidem. W Androidzie 9 wprowadziliśmy kilka ulepszeń, Funkcje ustawień i łatwiejsza implementacja.
Przykłady i źródło
Większość stron w Ustawieniach jest obecnie zaimplementowana za pomocą nowej platformy. Dobra
na przykład DisplaySettings:
packages/apps/Settings/src/com/android/settings/DisplaySettings.java
Poniżej znajdziesz ścieżki plików ważnych komponentów:
- Identyfikator kategorii:
packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java
- DashboardFragmentRegistry:
packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
- PanelFragment:
packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragment.java
- AbstractPreferenceController –
frameworks/base/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java
- BasePreferenceController (wprowadzone w Androidzie 9):
packages/apps/Settings/src/com/android/settings/core/BasePreferenceController.java
Implementacja
Zachęcamy producentów urządzeń do dostosowania dotychczasowych informacji o ustawieniach
i wstawić dodatkowe strony z ustawieniami, aby dostosować
funkcji przeznaczonych dla partnerów. Przenoszenie preferencji ze starszej strony (zaimplementowanej jako
SettingsPreferencePage
) do nowej strony (implementacji za pomocą
DashboardFragment
) może być skomplikowane. Preferencje z parametrów
starsza wersja strony prawdopodobnie nie jest zaimplementowana za pomocą tagu PreferenceController
.
Jeśli więc przenosisz preferencje ze starszej strony na nową, musisz utworzyć
PreferenceController
i przenieś kod do kontrolera przed
tworząc jej instancję w nowym formacie DashboardFragment
. Interfejsy API, które
Wymagania PreferenceController
są opisane w ich nazwie i
omówiono w języku Javadoc.
Zdecydowanie zalecamy dodanie testu jednostkowego do każdego elementu PreferenceController
.
Jeśli zmiana zostanie przesłana do AOSP, wymagany jest test jednostkowy.
Więcej informacji o tworzeniu testów opartych na Robolectric znajdziesz w
packages/apps/Settings/tests/robotests/README.md
.
Architektura informacji w stylu wtyczki
Każdy element ustawień jest zaimplementowany jako preferencja. Preferencję można łatwo przeniesione z jednej strony na drugą.
Aby ułatwić przenoszenie wielu ustawień, wprowadziliśmy Androida 8.0 fragment hosta w stylu wtyczki, który zawiera elementy ustawień. Elementy ustawień to modelowane jako kontrolery przypominające wtyczki. Dlatego stronę ustawień tworzy z pojedynczym fragmentem hosta i z kilkoma kontrolerami ustawień.
Fragment panelu
DashboardFragment
jest hostem kontrolerów preferencji stylu wtyczki.
Fragment dziedziczy z elementu PreferenceFragment
i zawiera elementy zaczepienia do
możesz rozwijać i aktualizować zarówno statyczne, jak i dynamiczne listy preferencji.
Ustawienia statyczne
Statyczna lista preferencji jest zdefiniowana w pliku XML za pomocą tagu <Preference>
. O
Implementacja DashboardFragment
korzysta z metody
getPreferenceScreenResId()
określa, który plik XML zawiera
statyczną listę ustawień do wyświetlenia.
Preferencje dynamiczne
Element dynamiczny reprezentuje kafelek z intencją i prowadzi do zewnętrznego lub wewnętrznego
Aktywność. Zwykle intencja prowadzi do innej strony ustawień. Przykład:
„Google” element ustawienia na stronie głównej ustawień jest elementem dynamicznym. Dynamiczna,
elementy zostały zdefiniowane w AndroidManifest
(omówione poniżej) i zostały wczytane
za pomocą funkcji FeatureProvider
(zdefiniowanej jako
DashboardFeatureProvider
).
Ustawienia dynamiczne mają większe wymagania niż skonfigurowane statycznie. więc zwykle deweloperzy powinni wdrożyć ustawienie jako statyczne. Ustawienie dynamiczne może być jednak przydatne, gdy jest spełniony dowolny z tych warunków:
- To ustawienie nie zostało wprowadzone bezpośrednio w aplikacji Ustawienia (np. wstrzyknięcie ustawienia zaimplementowanego przez aplikacje OEM lub operatora).
- To ustawienie powinno się pojawić na stronie głównej Ustawień.
- Masz już aktywność dla tego ustawienia i nie chcesz implementować dodatkowej konfiguracji statycznej.
Aby skonfigurować Działanie jako ustawienie dynamiczne:
- Oznacz aktywność jako ustawienie dynamiczne, dodając do obiektu filtr intencji działania.
- Poinformuj aplikację Ustawienia, do której kategorii należy. Kategoria jest stałą,
zdefiniowane w funkcji
CategoryKey
. - Opcjonalnie: po wyświetleniu ustawienia dodaj tekst podsumowania.
Oto przykład w aplikacji Ustawienia na urządzeniu DisplaySettings
.
<activity android:name="Settings$DisplaySettingsActivity" android:label="@string/display_settings" android:icon="@drawable/ic_settings_display"> <!-- Mark the activity as a dynamic setting --> <intent-filter> <action android:name="com.android.settings.action.IA_SETTINGS" /> </intent-filter> <!-- Tell Settings app which category it belongs to --> <meta-data android:name="com.android.settings.category" android:value="com.android.settings.category.ia.homepage" /> <!-- Add a summary text when the setting is displayed --> <meta-data android:name="com.android.settings.summary" android:resource="@string/display_dashboard_summary"/> </activity>
Podczas renderowania fragment wymaga podania listy ustawień ze strony
Ustawienia XML i dynamiczne zdefiniowane w AndroidManifest
. Określa, czy
Elementy PreferenceController
są zdefiniowane w kodzie Javy lub pliku XML,
DashboardFragment
zarządza logiką obsługi każdego ustawienia
do PreferenceController
(opisane poniżej). Następnie są
wyświetlane w interfejsie w postaci mieszanej listy.
Kontroler preferencji
Występują różnice między implementacją PreferenceController
w Androidzie 9 i 8.x, jak opisano w tym
.
PreferenceController w Androidzie 9
PreferenceController
zawiera wszystkie funkcje logiczne interakcji z parametrem
w tym wyświetlanie, aktualizowanie, indeksowanie wyszukiwania itp.
Interfejs usługi PreferenceController
jest zdefiniowany jako
BasePreferenceController
Zobacz kod w
packages/apps/Settings/src/com/android/settings/core/
BasePreferenceController.java
Istnieje kilka podklasy klasy BasePreferenceController
, z których każda
mapowania na konkretny styl interfejsu obsługiwany domyślnie przez aplikację Ustawienia. Dla:
na przykład TogglePreferenceController
ma interfejs API, który bezpośrednio mapuje
jak użytkownik powinien wchodzić w interakcję z interfejsem preferencji opartym na przełącznikach.
BasePreferenceController
ma interfejsy API takie jak
getAvailabilityStatus()
, displayPreference()
handlePreferenceTreeClicked(),
itp. Szczegółowa dokumentacja każdego
Interfejs API należy do klasy interfejsu.
Ograniczenie dotyczące implementacji zasad BasePreferenceController
(oraz
jej podklas, takich jak TogglePreferenceController
), jest to, że funkcja
podpis konstruktora musi pasować do jednej z tych wartości:
public MyController(Context context, String key) {}
public MyController(Context context) {}
Gdy instalujesz preferencję dotyczącą fragmentu, panel udostępnia metodę
Dołącz PreferenceController
przed czasem wyświetlania. W momencie instalacji
kontroler jest podłączony do fragmentu, aby wszystkie przyszłe zdarzenia były
wysłane na kontroler.
DashboardFragment
przechowuje listę
PreferenceController
na ekranie. W przypadku fragmentu
onCreate()
, wszystkie kontrolery są wywoływane dla instancji
getAvailabilityStatus()
, a jeśli zwraca wartość prawda,
Metoda displayPreference()
jest wywoływana w celu przetworzenia logiki wyświetlania.
Parametr getAvailabilityStatus()
jest też ważny, ponieważ przekazuje Ustawienia
które elementy są dostępne podczas wyszukiwania.
PreferenceController w Androidzie 8.x
PreferenceController
zawiera wszystkie funkcje logiczne interakcji z parametrem
w tym wyświetlanie, aktualizowanie i indeksowanie wyników wyszukiwania. ip.
Odpowiadając na interakcje z preferencjami, interfejs
PreferenceController
ma interfejsy API isAvailable()
,
displayPreference()
, handlePreferenceTreeClicked()
itd.
Szczegółową dokumentację każdego interfejsu API znajdziesz w klasie interfejsu.
Gdy instalujesz preferencję dotyczącą fragmentu, panel udostępnia metodę
Dołącz PreferenceController
przed czasem wyświetlania. W momencie instalacji
kontroler jest podłączony do fragmentu, aby wszystkie przyszłe zdarzenia były
wysłane na kontroler.
DashboardFragment
przechowuje na ekranie listę elementów PreferenceControllers
. W onCreate()
fragmentu wszystkie
kontrolery są wywoływane dla metody isAvailable()
, a jeśli
zwraca wartość true, funkcja displayPreference()
jest wywoływana w celu przetworzenia wyświetlacza
logikę logiczną.
Użyj elementu DashboardFragment
Przenoszenie preferencji ze strony A na B
Jeśli preferencja jest statyczna w pliku XML preferencji strony oryginalnej wykonaj procedurę przenoszenia statycznego na urządzeniu z Androidem. . W przeciwnym razie wykonaj procedurę dynamicznego przenoszenia. wersji Androida.
Statyczne zmiany na Androidzie 9
- Znajdź preferowane pliki XML strony oryginalnej i miejsca docelowego
stronę. Te informacje znajdziesz w
Metoda
getPreferenceScreenResId()
. - Usuń tę preferencję z kodu XML strony oryginalnej.
- Dodaj tę preferencję do kodu XML strony docelowej.
- Usuń
PreferenceController
dla tej preferencji z w implementacji języka Java dla strony oryginalnej. Zwykle jest wcreatePreferenceControllers()
Kontroler może być zadeklarowany w XML.Uwaga: to ustawienie może nie mieć
PreferenceController
- Utwórz instancję
PreferenceController
w kodzie strony docelowejcreatePreferenceControllers()
Jeśli ElementPreferenceController
jest zdefiniowany w pliku XML na starej stronie. Zdefiniuj go. w pliku XML dla nowej strony.
Dynamiczne przenoszenie na Androidzie 9
- Sprawdź, która kategoria zawiera strona oryginalna i strona docelowa. Dostępne opcje
znaleźć te informacje w
DashboardFragmentRegistry
. - Otwórz plik
AndroidManifest.xml
zawierający Twoje ustawienie musisz przenieść i znaleźć wpis Aktywność reprezentujący to ustawienie. - Ustaw wartość metadanych aktywności dla:
com.android.settings.category
do klucza kategorii nowej strony.
Statyczne zmiany w wersjach Androida 8.x
- Znajdź preferowane pliki XML strony oryginalnej i strony docelowej. Te informacje możesz znaleźć za pomocą metody
- Usuń to ustawienie w kodzie XML strony oryginalnej.
- Dodaj preferencję do pliku XML strony docelowej.
- Usuń
PreferenceController
dla tej preferencji w w implementacji języka Java dla strony oryginalnej. Zwykle jest wgetPreferenceControllers()
- Utwórz instancję
PreferenceController
w kodzie strony docelowejgetPreferenceControllers()
getPreferenceScreenResId()
strony.
Uwaga: możliwe, że ustawienie nie ma
PreferenceController
Dynamiczne przenoszenie w wersjach Androida 8.x
- Sprawdź, która kategoria zawiera strona oryginalna i strona docelowa. Więcej
te informacje w
DashboardFragmentRegistry
. - Otwórz plik
AndroidManifest.xml
zawierający Twoje ustawienie musisz przenieść i znaleźć wpis Aktywność reprezentujący to ustawienie. - Zmień wartość metadanych aktywności w przypadku obiektu
com.android.settings.category
. ustaw jako punkt wartości klucz kategorii nowej strony.
Utwórz nowe ustawienie na stronie
Jeśli preferencja jest statyczna w pliku XML preferencji strony oryginalnej wykonaj poniższą procedurę statycznej. W przeciwnym razie postępuj zgodnie z dynamiczną.
Utwórz ustawienie statyczne
- Znajdź preferowane pliki XML dla strony. Te informacje można znaleźć za pomocą metody getPreferenceScreenResId() strony.
- Dodaj nowy element preferencji w pliku XML. Upewnij się, że jest w niej unikalny
android:key
. -
Określ
PreferenceController
dla tej preferencji w ustawieniach strony MetodagetPreferenceControllers()
.- Na Androidzie 8.x i opcjonalnie w Androidzie 9:
utwórz instancję
PreferenceController
dla tej preferencji w metodacreatePreferenceControllers()
strony.Jeśli to ustawienie istnieje już w innych miejscach, możliwe, że ma już status
PreferenceController
. Możesz użyć ponowniePreferenceController
bez utworzenia nowego. -
Począwszy od Androida w wersji 9, w przypadku Androida możesz zadeklarować parametr
PreferenceController
w pliku XML obok preferencji. Na przykład:<Preference android:key="reset_dashboard" android:title="@string/reset_dashboard_title" settings:controller="com.android.settings.system.ResetPreferenceController"/>
- Na Androidzie 8.x i opcjonalnie w Androidzie 9:
utwórz instancję
Tworzenie preferencji dynamicznych
- Sprawdź, która kategoria zawiera strona oryginalna i strona docelowa. Więcej
te informacje w
DashboardFragmentRegistry
. - Utwórz nową aktywność na zajęciach
AndroidManifest
- Dodaj do nowego działania niezbędne metadane, aby zdefiniować ustawienie. Ustaw parametr
wartości metadanych dla pola
com.android.settings.category
na tę samą wartość zdefiniowane w kroku 1.
Utwórz nową stronę
- Utwórz nowy fragment o dziedziczeniu z elementu
DashboardFragment
. - Określ jego kategorię w:
DashboardFragmentRegistry
.Uwaga: ten krok jest opcjonalny. Jeśli nie potrzebujesz dynamicznych preferencji na tej stronie, nie musisz podawać klucza kategorii.
- Postępuj zgodnie z instrukcjami dodawania ustawień wymaganych dla tej strony. Więcej więcej informacji znajdziesz w sekcji Implementacja.
Weryfikacja
- Uruchom testy automatyczne w Ustawieniach. Wszystkie istniejące i nowe testy powinny pomyślne.
- Skompiluj i zainstaluj Ustawienia, a następnie ręcznie otwórz modyfikowaną stronę. Strona powinna się natychmiast zaktualizować.