Architektura informacji

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
  • AbstractPreferenceControllerframeworks/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

  1. Znajdź preferowane pliki XML strony oryginalnej i miejsca docelowego stronę. Te informacje znajdziesz w Metoda getPreferenceScreenResId().
  2. Usuń tę preferencję z kodu XML strony oryginalnej.
  3. Dodaj tę preferencję do kodu XML strony docelowej.
  4. Usuń PreferenceController dla tej preferencji z w implementacji języka Java dla strony oryginalnej. Zwykle jest w createPreferenceControllers() Kontroler może być zadeklarowany w XML.

    Uwaga: to ustawienie może nie mieć PreferenceController

  5. Utwórz instancję PreferenceController w kodzie strony docelowej createPreferenceControllers() Jeśli Element PreferenceController jest zdefiniowany w pliku XML na starej stronie. Zdefiniuj go. w pliku XML dla nowej strony.

Dynamiczne przenoszenie na Androidzie 9

  1. Sprawdź, która kategoria zawiera strona oryginalna i strona docelowa. Dostępne opcje znaleźć te informacje w DashboardFragmentRegistry.
  2. Otwórz plik AndroidManifest.xml zawierający Twoje ustawienie musisz przenieść i znaleźć wpis Aktywność reprezentujący to ustawienie.
  3. Ustaw wartość metadanych aktywności dla: com.android.settings.category do klucza kategorii nowej strony.

Statyczne zmiany w wersjach Androida 8.x

  1. Znajdź preferowane pliki XML strony oryginalnej i strony docelowej.
  2. Te informacje możesz znaleźć za pomocą metody getPreferenceScreenResId() strony.
  3. Usuń to ustawienie w kodzie XML strony oryginalnej.
  4. Dodaj preferencję do pliku XML strony docelowej.
  5. Usuń PreferenceController dla tej preferencji w w implementacji języka Java dla strony oryginalnej. Zwykle jest w getPreferenceControllers()
  6. Uwaga: możliwe, że ustawienie nie ma PreferenceController

  7. Utwórz instancję PreferenceController w kodzie strony docelowej getPreferenceControllers()

Dynamiczne przenoszenie w wersjach Androida 8.x

  1. Sprawdź, która kategoria zawiera strona oryginalna i strona docelowa. Więcej te informacje w DashboardFragmentRegistry.
  2. Otwórz plik AndroidManifest.xml zawierający Twoje ustawienie musisz przenieść i znaleźć wpis Aktywność reprezentujący to ustawienie.
  3. 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

  1. Znajdź preferowane pliki XML dla strony. Te informacje można znaleźć za pomocą metody getPreferenceScreenResId() strony.
  2. Dodaj nowy element preferencji w pliku XML. Upewnij się, że jest w niej unikalny android:key.
  3. Określ PreferenceController dla tej preferencji w ustawieniach strony Metoda getPreferenceControllers().
    • Na Androidzie 8.x i opcjonalnie w Androidzie 9: utwórz instancję PreferenceController dla tej preferencji w metoda createPreferenceControllers() strony.

      Jeśli to ustawienie istnieje już w innych miejscach, możliwe, że ma już status PreferenceController. Możesz użyć ponownie PreferenceController 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"/>
      

Tworzenie preferencji dynamicznych

  1. Sprawdź, która kategoria zawiera strona oryginalna i strona docelowa. Więcej te informacje w DashboardFragmentRegistry.
  2. Utwórz nową aktywność na zajęciach AndroidManifest
  3. 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ę

  1. Utwórz nowy fragment o dziedziczeniu z elementu DashboardFragment.
  2. 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.

  3. 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ć.