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
PreferenceController
s 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
- Bevorzugte XML-Dateien für die Originalseite und das Ziel suchen
Seite. Diese Informationen finden Sie in der
getPreferenceScreenResId()
-Methode. - Entfernen Sie die Einstellung aus der XML-Datei der Originalseite.
- Fügen Sie die Einstellung in der XML-Datei der Zielseite hinzu.
- Entfernen Sie die
PreferenceController
für diese Einstellung aus dem die Java-Implementierung der Originalseite. In der Regel befindet sie sichcreatePreferenceControllers()
Der Controller könnte deklariert sein in XML direkt senden.Hinweis: Die Einstellung enthält möglicherweise kein
PreferenceController
- Instanziieren Sie
PreferenceController
in dercreatePreferenceControllers()
. Wenn diePreferenceController
ist auf der alten Seite in XML definiert – definiere dies in XML für die neue Seite.
Dynamische Veränderungen in Android 9
- Ermitteln Sie, welche Kategorie die Originalseite und die Zielseite hosten. Sie können
finden Sie diese Informationen in
DashboardFragmentRegistry
. - Öffnen Sie die Datei
AndroidManifest.xml
mit der gewünschten Einstellung. verschieben und den Aktivitätseintrag für diese Einstellung finden. - 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
- Suchen Sie die bevorzugten XML-Dateien für die Originalseite und die Zielseite. Sie finden diese Informationen in der
- Entfernen Sie die Einstellung in der XML-Datei der Originalseite.
- Fügen Sie die Einstellung der XML-Datei der Zielseite hinzu.
- Entfernen Sie die
PreferenceController
für diese Einstellung in der die Java-Implementierung der Originalseite. In der Regel befindet sie sichgetPreferenceControllers()
- Instanziieren Sie
PreferenceController
in dergetPreferenceControllers()
.
getPreferenceScreenResId()
-Methode der Seite.
Hinweis:Möglicherweise enthält die Einstellung keine
PreferenceController
Dynamische Verschiebung in Android 8.x-Releases
- Ermitteln Sie, welche Kategorie die Originalseite und die Zielseite hosten. Sie finden
diese Informationen auf
DashboardFragmentRegistry
. - Öffnen Sie die Datei
AndroidManifest.xml
mit der gewünschten Einstellung. verschieben und den Aktivitätseintrag für diese Einstellung finden. - 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
- Suche nach den bevorzugten XML-Dateien für die Seite. Diese Informationen finden Sie mithilfe der Methode getPreferenceScreenResId() der Seite.
- Fügen Sie ein neues Einstellungselement in der XML-Datei hinzu. Er muss eine eindeutige
android:key
haben. -
Legen Sie ein
PreferenceController
für diese Einstellung in dergetPreferenceControllers()
-Methode.- Unter Android 8.x und optional in Android 9
instanziieren Sie ein
PreferenceController
für diese Einstellung imcreatePreferenceControllers()
-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 diePreferenceController
, 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"/>
- Unter Android 8.x und optional in Android 9
instanziieren Sie ein
Dynamische Einstellungen erstellen
- Ermitteln Sie, welche Kategorie die Originalseite und die Zielseite hosten. Sie finden
diese Informationen auf
DashboardFragmentRegistry
. - Neue Aktivität in
AndroidManifest
erstellen - 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
- Erstellt ein neues Fragment, das die Übernahme von
DashboardFragment
übernimmt. - 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.
- 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.