Informationsarchitektur

Mit Android 8.0 wurde eine neue Informationsarchitektur für die App „Einstellungen“ eingeführt, um um die Organisation der Einstellungen zu vereinfachen und es den Nutzenden zu erleichtern, schnell Einstellungen zur Anpassung ihrer Android-Geräte finden. Unter Android 9 wurden einige Verbesserungen eingeführt, um Einstellungsfunktionen und einfachere Implementierung.

Beispiele und Quelle

Die meisten Seiten in den Einstellungen werden derzeit mit dem neuen Framework implementiert. Eine gute Beispiel ist DisplaySettings: packages/apps/Settings/src/com/android/settings/DisplaySettings.java

Dateipfade für wichtige Komponenten sind unten aufgeführt:

  • CategoryKey: packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java
  • DashboardFragmentRegistry: packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
  • DashboardFragment: packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragment.java
  • Abstrakte Präferenzen-Controller: frameworks/base/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java
  • BasePreferenceController (in Android 9 eingeführt): packages/apps/Settings/src/com/android/settings/core/BasePreferenceController.java

Implementierung

Geräteherstellern wird empfohlen, die vorhandenen Informationen in den Einstellungen anzupassen. Architektur und fügen Sie nach Bedarf zusätzliche Einstellungsseiten ein, um partnerspezifische Funktionen nutzen. Das Verschieben von Einstellungen von der alten Seite (implementiert als SettingsPreferencePage) in eine neue Seite (implementiert mithilfe von DashboardFragment) kann kompliziert sein. Die Einstellung des Legacy-Seite ist wahrscheinlich nicht mit PreferenceController implementiert.

Wenn Sie also Einstellungen von einer Legacy-Seite auf eine neue Seite verschieben, müssen Sie ein PreferenceController und verschiebe den Code vorher in den Controller und in der neuen DashboardFragment instanziiert wird. Die APIs, die PreferenceController-Anforderungen sind im Namen und die in Javadoc dokumentiert sind.

Es wird dringend empfohlen, für jede PreferenceController einen Unittest hinzuzufügen. Wenn die Änderung bei AOSP eingereicht wird, ist ein Unittest erforderlich. Weitere Informationen zum Schreiben von Robolectric-basierten Tests finden Sie in der Readme-Datei packages/apps/Settings/tests/robotests/README.md.

Informationsarchitektur im Plug-in-Stil

Jedes Einstellungselement wird als Einstellung implementiert. Eine Einstellung kann ganz einfach von einer Seite auf eine andere verschoben.

Um das Verschieben mehrerer Einstellungen zu erleichtern, wurde mit Android 8.0 Ein Hostfragment im Plug-in-Stil, das Einstellungselemente enthält. Einstellungselemente sind die als Controller im Plug-in-Stil modelliert sind. Daher wird eine Einstellungsseite von einem einem einzelnen Hostfragment und mehreren Einstellungs-Controllern.

Dashboard-Fragment

DashboardFragment ist der Host von bevorzugten Controllern im Plug-in-Stil. Das Fragment erbt von PreferenceFragment und hat Hooks für statische und dynamische Einstellungslisten erweitern und aktualisieren.

Statische Einstellungen

Eine statische Einstellungsliste wird in XML mit dem Tag <Preference> definiert. A Die DashboardFragment-Implementierung verwendet die getPreferenceScreenResId()-Methode zur Definition, welche XML-Datei enthalten ist die statische Liste der anzuzeigenden Einstellungen.

Dynamische Einstellungen

Ein dynamisches Element stellt eine Kachel mit Intent dar, die zu einem externen oder internen Element führt. Aktivität. Normalerweise führt der Intent zu einer anderen Einstellungsseite. Beispiel: das „Google“ Einstellungselement auf der Startseite „Einstellungen“ ist ein dynamisches Element. Dynamisch Elemente sind in AndroidManifest definiert (wie unten erörtert) und geladen über FeatureProvider (definiert als DashboardFeatureProvider).

Dynamische Einstellungen sind komplexer als statisch konfiguriert Entwickler sollten die Einstellung daher normalerweise als statische Einstellung implementieren. Die dynamische Einstellung kann jedoch nützlich sein, wenn eine der folgenden Bedingungen zutrifft:

  • Die Einstellung ist nicht direkt in der App „Einstellungen“ implementiert (z. B. das Einfügen einer Einstellung, die von OEM-/Mobilfunkanbieter-Apps implementiert wurde.
  • Die Einstellung sollte auf der Startseite der Einstellungen angezeigt werden.
  • Sie haben bereits eine Aktivität für die Einstellung und möchten die zusätzliche statische Konfiguration.

So konfigurieren Sie eine Aktivität als dynamische Einstellung:

  • Markieren Sie die Aktivität als dynamische Einstellung, indem Sie einen Intent-Filter zum Aktivitäten.
  • Teilen Sie der App „Einstellungen“ mit, zu welcher Kategorie sie gehört. Die Kategorie ist eine Konstante, definiert in CategoryKey.
  • Optional: Fügen Sie eine Zusammenfassung hinzu, wenn die Einstellung angezeigt wird.

Hier ist ein Beispiel aus den Einstellungen für 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>

Zum Zeitpunkt des Renderings fragt das Fragment nach einer Liste von Einstellungen beider statischen Elemente XML- und dynamische Einstellungen in AndroidManifest definiert. Ob die PreferenceController-Elemente sind im Java-Code oder in XML definiert. DashboardFragment verwaltet die Verarbeitungslogik jeder Einstellung bis PreferenceController (siehe unten). Dann sind sie werden in der Benutzeroberfläche als gemischte Liste angezeigt.

Präferenz-Controller

Es gibt Unterschiede zwischen der Implementierung von PreferenceController in Android 9 und Android 8.x an, wie in diesem .

PreferenceController in Android 9-Version

Ein PreferenceController enthält die gesamte Logik für die Interaktion mit der Präferenz, einschließlich Anzeige, Aktualisierung, Suchindexierung usw.

Die Schnittstelle von PreferenceController ist definiert als BasePreferenceController. Siehe Code in packages/apps/Settings/src/com/android/settings/core/ BasePreferenceController.java

Es gibt mehrere abgeleitete Klassen von BasePreferenceController, Zuordnung zu einem bestimmten UI-Stil, den die App "Einstellungen" standardmäßig unterstützt. Für Beispiel: TogglePreferenceController hat eine API, die den festlegen, wie Nutzende mit einer UI für Einstellungen, die auf Ein/Aus-Schaltfläche basieren, interagieren sollen.

BasePreferenceController hat APIs wie getAvailabilityStatus(), displayPreference(), handlePreferenceTreeClicked(), usw. Detaillierte Dokumentation für jede Die API befindet sich in der Klasse „Interface“.

Eine Einschränkung zur Implementierung von BasePreferenceController (und seinen abgeleiteten Klassen wie TogglePreferenceController), ist, -Konstruktorsignatur muss einem der folgenden Elemente entsprechen:

  • public MyController(Context context, String key) {}
  • public MyController(Context context) {}

Während der Installation einer Einstellung für das Fragment bietet das Dashboard eine Methode, PreferenceController vor der Anzeigezeit einfügen. Bei der Installation Der Controller ist mit dem Fragment verbunden, sodass alle zuk��nftigen relevanten Ereignisse an den Controller gesendet.

DashboardFragment behält eine Liste mit PreferenceControllers auf dem Bildschirm. Im Fragment onCreate(), werden alle Controller für den getAvailabilityStatus() und wenn sie "true" zurückgibt, displayPreference() wird aufgerufen, um die Anzeigelogik zu verarbeiten. getAvailabilityStatus() ist auch wichtig, die Einstellungen zu definieren, welche Elemente bei der Suche verfügbar sind.

PreferenceController in Android 8.x-Releases

Ein PreferenceController enthält die gesamte Logik für die Interaktion mit der einschließlich Anzeigen, Aktualisieren und Indexierung der Suche. usw.

Entsprechend den bevorzugten Interaktionen enthält die Schnittstelle von PreferenceController die APIs isAvailable(), displayPreference(), handlePreferenceTreeClicked() usw. Detaillierte Informationen zu den einzelnen APIs finden Sie in der Interface-Klasse.

Während der Installation einer Einstellung für das Fragment bietet das Dashboard eine Methode, PreferenceController vor der Anzeigezeit einfügen. Bei der Installation Der Controller ist mit dem Fragment verbunden, sodass alle zukünftigen relevanten Ereignisse an den Controller gesendet.

DashboardFragment behält eine Liste von PreferenceControllers auf dem Bildschirm. Bei onCreate() des Fragments werden alle Controller für die Methode isAvailable() aufgerufen werden und wenn diese gibt "true" zurück und displayPreference() wird aufgerufen, um die Anzeige zu verarbeiten Logik.

DashboardFragment verwenden

Eine Einstellung von Seite A nach B verschieben

Wenn die Einstellung statisch in der Einstellungs-XML der Originalseite aufgeführt ist folgen Sie der statischen Verschiebung für Ihr Android-Gerät. Veröffentlichung unten. Folgen Sie andernfalls der Anleitung zum dynamischen Verschieben. für Ihre Android-Version.

Statischer Umzug in Android 9

  1. Bevorzugte XML-Dateien für die Originalseite und das Ziel suchen Seite. Diese Informationen finden Sie in der getPreferenceScreenResId()-Methode.
  2. Entfernen Sie die Einstellung aus der XML-Datei der Originalseite.
  3. Fügen Sie die Einstellung in der XML-Datei der Zielseite hinzu.
  4. Entfernen Sie die PreferenceController für diese Einstellung aus dem die Java-Implementierung der Originalseite. In der Regel befindet sie sich createPreferenceControllers() Der Controller könnte deklariert sein in XML direkt senden.

    Hinweis: Die Einstellung enthält möglicherweise kein PreferenceController

  5. Instanziieren Sie PreferenceController in der createPreferenceControllers(). Wenn die PreferenceController ist auf der alten Seite in XML definiert – definiere dies in XML für die neue Seite.

Dynamische Veränderungen in Android 9

  1. Ermitteln Sie, welche Kategorie die Originalseite und die Zielseite hosten. Sie können finden Sie diese Informationen in DashboardFragmentRegistry.
  2. Öffnen Sie die Datei AndroidManifest.xml mit der gewünschten Einstellung. verschieben und den Aktivitätseintrag für diese Einstellung finden.
  3. Metadatenwert der Aktivität festlegen für com.android.settings.category auf den Kategorieschlüssel der neuen Seite.

Statischer Umzug in Android 8.x-Releases

  1. Suchen Sie die bevorzugten XML-Dateien für die Originalseite und die Zielseite.
  2. Sie finden diese Informationen in der getPreferenceScreenResId() -Methode der Seite.
  3. Entfernen Sie die Einstellung in der XML-Datei der Originalseite.
  4. Fügen Sie die Einstellung der XML-Datei der Zielseite hinzu.
  5. Entfernen Sie die PreferenceController für diese Einstellung in der die Java-Implementierung der Originalseite. In der Regel befindet sie sich getPreferenceControllers()
  6. Hinweis:Möglicherweise enthält die Einstellung keine PreferenceController

  7. Instanziieren Sie PreferenceController in der getPreferenceControllers().

Dynamische Verschiebung in Android 8.x-Releases

  1. Ermitteln Sie, welche Kategorie die Originalseite und die Zielseite hosten. Sie finden diese Informationen auf DashboardFragmentRegistry.
  2. Öffnen Sie die Datei AndroidManifest.xml mit der gewünschten Einstellung. verschieben und den Aktivitätseintrag für diese Einstellung finden.
  3. Metadatenwert der Aktivität für com.android.settings.category ändern Wertpunkt auf den Kategorieschlüssel der neuen Seite setzen.

Neue Einstellung auf einer Seite erstellen

Wenn die Einstellung statisch in der Einstellungs-XML der Originalseite aufgeführt ist -Datei befindet, folgen Sie dem statischen Verfahren unten. Andernfalls folgen Sie der dynamische Prozedur.

Statische Einstellung erstellen

  1. Suche nach den bevorzugten XML-Dateien für die Seite. Diese Informationen finden Sie mithilfe der Methode getPreferenceScreenResId() der Seite.
  2. Fügen Sie ein neues Einstellungselement in der XML-Datei hinzu. Er muss eine eindeutige android:key haben.
  3. Legen Sie ein PreferenceController für diese Einstellung in der getPreferenceControllers()-Methode.
    • Unter Android 8.x und optional in Android 9 instanziieren Sie ein PreferenceController für diese Einstellung im createPreferenceControllers()-Methode der Seite hinzugefügt.

      Wenn diese Einstellung bereits an anderen Stellen existiert hat, kann es sein, dass ist bereits PreferenceController dafür. Sie können die PreferenceController, ohne ein neues zu erstellen.

    • Ab Android 9 können Sie das PreferenceController in XML neben der Einstellung. Hier einige Beispiele:
      <Preference
              android:key="reset_dashboard"
              android:title="@string/reset_dashboard_title"
              settings:controller="com.android.settings.system.ResetPreferenceController"/>
      

Dynamische Einstellungen erstellen

  1. Ermitteln Sie, welche Kategorie die Originalseite und die Zielseite hosten. Sie finden diese Informationen auf DashboardFragmentRegistry.
  2. Neue Aktivität in AndroidManifest erstellen
  3. Füge der neuen Activity-Klasse die erforderlichen Metadaten hinzu, um die Einstellung zu definieren. Legen Sie die Metadatenwert für com.android.settings.category auf denselben Wert wie in Schritt 1 definiert.

Neue Seite erstellen

  1. Erstellt ein neues Fragment, das die Übernahme von DashboardFragment übernimmt.
  2. Definieren Sie die Kategorie in DashboardFragmentRegistry.

    Hinweis:Dieser Schritt ist optional. Wenn Sie keine keine dynamischen Einstellungen auf dieser Seite vornehmen, müssen Sie keinen Kategorieschlüssel angeben.

  3. Führen Sie die Schritte zum Hinzufügen der Einstellungen aus, die für diese Seite erforderlich sind. Weitere Informationen Informationen finden Sie im Abschnitt Implementierung.

Zertifizierungsstufe

  • Führe die robolectric-Tests in den Einstellungen aus. Alle bestehenden und neuen Tests sollten übergeben.
  • Erstellen und installieren Sie die Einstellungen und öffnen Sie dann die Seite, die geändert wird, manuell. Die Seite sollte sofort aktualisiert werden.