Informationsarchitektur

Mit Android 8.0 wurde eine neue Informationsarchitektur für die Einstellungen-App eingeführt, um die Organisation der Einstellungen zu vereinfachen und Nutzern die schnelle Suche nach Einstellungen zur Anpassung ihrer Android-Geräte zu erleichtern. 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

Die 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ätehersteller werden aufgefordert, die vorhandene Architektur der Einstellungen anzupassen und nach Bedarf zusätzliche Seiten mit Einstellungen einzufügen, um partnerspezifische Funktionen zu berücksichtigen. Das Verschieben von Einstellungen von der alten Seite (implementiert als SettingsPreferencePage) auf eine neue Seite (implementiert mit DashboardFragment) kann schwierig sein. Die Einstellung auf der alten Seite ist wahrscheinlich nicht mit einem 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 packages/apps/Settings/tests/robotests/README.md.

Informationsarchitektur im Plug-in-Stil

Jedes Element der Einstellungen wird als Einstellung implementiert. Eine Einstellung kann ganz einfach von einer Seite auf eine andere verschoben werden.

Damit sich mehrere Einstellungen leichter verschieben lassen, wurde in Android 8.0 ein Plug-in-ähnliches Host-Fragment mit Einstellungselementen eingeführt. Einstellungen werden als Plug-in-Controller modelliert. Daher wird eine Einstellungsseite von einem einem einzelnen Hostfragment und mehreren Einstellungs-Controllern.

DashboardFragment

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. Bei einer DashboardFragment-Implementierung wird mit der Methode getPreferenceScreenResId() definiert, welche XML-Datei die statische Liste der anzuzeigenden Einstellungen enthält.

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. Dynamische Elemente werden in AndroidManifest (siehe unten) definiert und über ein FeatureProvider (definiert als DashboardFeatureProvider) geladen.

Dynamische Einstellungen sind komplexer als statisch konfiguriert Entwickler sollten die Einstellung daher normalerweise als statische Einstellung implementieren. Die dynamische Einstellung kann jedoch in folgenden Fällen nützlich sein:

  • Die Einstellung ist nicht direkt in den Einstellungen implementiert (z. B. Einschleusen 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 nicht implementieren.

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 ein Beispiel aus der Einstellungen App 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. Unabhängig davon, ob die PreferenceControllers in Java-Code oder in XML definiert sind, verwaltet DashboardFragment die Verarbeitungslogik jeder Einstellung über PreferenceController (siehe unten). Sie werden dann in der Benutzeroberfläche als gemischte Liste angezeigt.

Präferenz-Controller

Die Implementierung von PreferenceController unter Android 9 und Android 8.x unterscheidet sich, wie in diesem Abschnitt beschrieben.

PreferenceController in der 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. Beispiel: 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, der standardmäßig von der App „Einstellungen“ unterstützt wird. TogglePreferenceController hat beispielsweise eine API, die direkt darauf abbildet, wie der Nutzer mit einer UI für die Einstellungsschalter interagieren soll.

BasePreferenceController hat APIs wie getAvailabilityStatus(), displayPreference() und handlePreferenceTreeClicked(),. Eine detaillierte Dokumentation für jede API befindet sich in der Interface-Klasse.

Bei der Implementierung von BasePreferenceController (und deren Unterklassen wie TogglePreferenceController) ist zu beachten, dass die Signatur des Konstruktors einer der folgenden Optionen entsprechen muss:

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

Beim Installieren einer Einstellung für das Fragment bietet das Dashboard eine Methode, um vor der Auslieferung ein PreferenceController anzuhängen. Bei der Installation wird der Controller mit dem Fragment verbunden, damit alle zukünftigen relevanten Ereignisse an den Controller gesendet werden.

DashboardFragment behält eine Liste von 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, um dem Einstellungs-Framework mitzuteilen, 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.

Beim Installieren einer Einstellung für das Fragment bietet das Dashboard eine Methode, um vor der Auslieferung ein PreferenceController anzuhängen. Bei der Installation wird der Controller mit dem Fragment verbunden, damit alle zukünftigen relevanten Ereignisse an den Controller gesendet werden.

DashboardFragment behält eine Liste von PreferenceControllers auf dem Bildschirm. Beim onCreate() des Fragments werden alle Controller für die isAvailable()-Methode aufgerufen. Wenn diese Methode „wahr“ zurückgibt, wird displayPreference() aufgerufen, um die Anzeigelogik zu verarbeiten.

DashboardFragment verwenden

Eine Einstellung von Seite A auf Seite 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. Andernfalls folgen Sie der dynamischen Verschiebeprozedur für Ihre Android-Version.

Statische Bewegung in Android 9

  1. Suchen Sie die XML-Dateien mit den Einstellungen für die ursprüngliche Seite und die Zielseite. 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 der XML-Datei der Zielseite hinzu.
  4. Entfernen Sie die PreferenceController für diese Einstellung aus dem die Java-Implementierung der Originalseite. Normalerweise ist das createPreferenceControllers(). Der Controller kann auch direkt in XML deklariert werden.

    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.

Dynamisches Verschieben unter 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 Einstellung, die Sie verschieben möchten, und suchen Sie den Aktivitätseintrag, der diese Einstellung darstellt.
  3. Legen Sie den Metadatenwert der Aktivität für com.android.settings.category auf den Kategorieschlüssel der neuen Seite fest.

Statische Verschiebung in Android 8.x-Releases

  1. Suchen Sie die XML-Dateien mit den Einstellungen für die ursprüngliche Seite und die Zielseite.
  2. Sie finden diese Informationen in der getPreferenceScreenResId() -Methode der Seite.
  3. Entfernen Sie die Einstellung in der XML-Datei der ursprünglichen Seite.
  4. Fügen Sie die Einstellung in die XML-Datei der Zielseite ein.
  5. Entfernen Sie das PreferenceController für diese Einstellung in der Java-Implementierung der ursprünglichen Seite. Normalerweise ist das getPreferenceControllers().
  6. Hinweis:Möglicherweise enthält die Einstellung keine PreferenceController

  7. Instanziere die PreferenceController im getPreferenceControllers() der Zielseite.

Dynamische Verschiebung in Android 8.x-Releases

  1. Ermitteln Sie, welche Kategorie die Originalseite und die Zielseite hosten. Sie finden diese Informationen unter 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 der XML-Datei ein neues Element vom Typ „Preference“ hinzu. Er muss eine eindeutige android:key haben.
  3. Definiere in der getPreferenceControllers()-Methode der Seite einen PreferenceController für diese Einstellung.
    • 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 anderer Stelle vorhanden war, gibt es möglicherweise bereits eine 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. Beispiel:
      <Preference
              android:key="reset_dashboard"
              android:title="@string/reset_dashboard_title"
              settings:controller="com.android.settings.system.ResetPreferenceController"/>

Dynamische Einstellungen erstellen

  1. Finden Sie heraus, zu welcher Kategorie die Original- und Zielseite gehören. Sie finden diese Informationen auf DashboardFragmentRegistry.
  2. Neue Aktivität in AndroidManifest erstellen
  3. Fügen Sie der neuen Aktivität 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. Folgen Sie der Anleitung, um die für diese Seite erforderlichen Einstellungen hinzuzufügen. Weitere Informationen Informationen finden Sie im Abschnitt Implementierung.

Zertifizierungsstufe

  • Führen Sie die Robolectric-Tests in den Einstellungen aus. Alle vorhandenen und neuen Tests sollten funktionieren.
  • Erstellen und installieren Sie die Einstellungen und öffnen Sie dann die zu ändernde Seite manuell. Die Seite sollte sofort aktualisiert werden.