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 PreferenceController
s 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 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, 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
- 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. - Entfernen Sie die Einstellung aus der XML-Datei der Originalseite.
- Fügen Sie die Einstellung der XML-Datei der Zielseite hinzu.
- Entfernen Sie die
PreferenceController
für diese Einstellung aus dem die Java-Implementierung der Originalseite. Normalerweise ist dascreatePreferenceControllers()
. Der Controller kann auch direkt in XML deklariert werden.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.
Dynamisches Verschieben unter 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 Einstellung, die Sie verschieben möchten, und suchen Sie den Aktivitätseintrag, der diese Einstellung darstellt. - 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
- Suchen Sie die XML-Dateien mit den Einstellungen für die ursprüngliche Seite und die Zielseite. Sie finden diese Informationen in der
- Entfernen Sie die Einstellung in der XML-Datei der ursprünglichen Seite.
- Fügen Sie die Einstellung in die XML-Datei der Zielseite ein.
- Entfernen Sie das
PreferenceController
für diese Einstellung in der Java-Implementierung der ursprünglichen Seite. Normalerweise ist dasgetPreferenceControllers()
. - Instanziere die
PreferenceController
imgetPreferenceControllers()
der Zielseite.
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 unter
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 der XML-Datei ein neues Element vom Typ „Preference“ hinzu. Er muss eine eindeutige
android:key
haben. -
Definiere in der
getPreferenceControllers()
-Methode der Seite einenPreferenceController
für diese Einstellung.- 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 anderer Stelle vorhanden war, gibt es möglicherweise bereits eine
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. Beispiel:<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
- Finden Sie heraus, zu welcher Kategorie die Original- und Zielseite gehören. Sie finden
diese Informationen auf
DashboardFragmentRegistry
. - Neue Aktivität in
AndroidManifest
erstellen - 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
- 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.
- 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.