Architettura delle informazioni

Android 8.0 ha introdotto una nuova architettura delle informazioni per l'app Impostazioni per semplificare il modo in cui le impostazioni sono organizzate e permettere agli utenti di trovare rapidamente le impostazioni per personalizzare i propri dispositivi Android. Android 9 ha introdotto alcuni miglioramenti per fornire Funzionalità delle impostazioni e implementazione più semplice.

Esempi e fonte

La maggior parte delle pagine delle Impostazioni è attualmente implementata con il nuovo framework. Un buon ad esempio Impostazioni Display: packages/apps/Settings/src/com/android/settings/DisplaySettings.java

Di seguito sono elencati i percorsi dei file per i componenti importanti:

  • 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
  • AbstractPreferenceController: frameworks/base/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java
  • BasePreferenceController (introdotto in Android 9): packages/apps/Settings/src/com/android/settings/core/BasePreferenceController.java

Implementazione

Consigliamo ai produttori di dispositivi di adattare le informazioni delle Impostazioni esistenti e inserire altre pagine di impostazioni in base alle esigenze funzioni specifiche per i partner. Spostamento delle preferenze dalla pagina precedente (implementata come SettingsPreferencePage) in una nuova pagina (implementata utilizzando DashboardFragment) può essere complicato. La preferenza pagina precedente probabilmente non è implementata con un PreferenceController.

Perciò, quando sposti una preferenza da una pagina legacy a una nuova, dovrai creare una PreferenceController e sposta il codice nel controller prima creando un'istanza nel nuovo DashboardFragment. Le API che I requisiti di PreferenceController sono descritti nel nome e documentati in Javadoc.

Ti consigliamo vivamente di aggiungere un test delle unità per ogni PreferenceController. Se la modifica viene inviata ad AOSP, è necessario un test delle unità. Per ulteriori informazioni su come scrivere test robotici, consulta la file Leggimi packages/apps/Settings/tests/robotests/README.md.

Architettura delle informazioni stile plug-in

Ogni elemento delle impostazioni viene implementato come una preferenza. Una preferenza può essere sono state spostate da una pagina all'altra.

Per semplificare lo spostamento di più impostazioni, Android 8.0 ha introdotto un frammento host in stile plug-in che contiene gli elementi delle impostazioni. Le voci di impostazioni sono modellati come controller in stile plug-in. Pertanto, una pagina delle impostazioni viene creata un singolo frammento host e più controller di impostazione.

Frammento Dashboard

DashboardFragment è l'host dei controller delle preferenze in stile plug-in. Il frammento eredita da PreferenceFragment e ha hook a espandere e aggiornare sia gli elenchi di preferenze statici sia quelli dinamici.

Preferenze statiche

Viene definito un elenco di preferenze statico in XML utilizzando il tag <Preference>. R L'implementazione DashboardFragment utilizza Metodo getPreferenceScreenResId() per definire quale file XML contiene l'elenco statico di preferenze da visualizzare.

Preferenze dinamiche

Un elemento dinamico rappresenta un riquadro con l'intento, che conduce a una Attività. Di solito, l'intent porta a una pagina di impostazioni diversa. Ad esempio: Google nella home page Impostazioni è un elemento dinamico. Dinamico elementi sono definiti in AndroidManifest (esaminati di seguito) e caricati attraverso un FeatureProvider (definito come DashboardFeatureProvider).

Le impostazioni dinamiche sono più complesse rispetto a quelle configurate in modo statico di sistema, pertanto in genere gli sviluppatori dovrebbero implementarla come impostazione statica. Tuttavia, l'impostazione dinamica può essere utile quando si verifica una delle seguenti condizioni:

  • L'impostazione non è implementata direttamente nell'app Impostazioni (ad esempio l'inserimento di un'impostazione implementata dalle app dell'OEM/dell'operatore).
  • L'impostazione viene visualizzata nella home page delle Impostazioni.
  • Hai già un'attività per l'impostazione e non vuoi implementare il una configurazione statica aggiuntiva.

Per configurare un'attività come impostazione dinamica:

  • Contrassegna l'attività come impostazione dinamica aggiungendo un filtro per intent al attività.
  • Indica all'app Impostazioni a quale categoria appartiene. La categoria è una costante, definito in CategoryKey.
  • (Facoltativo) Aggiungi un testo di riepilogo quando l'impostazione viene visualizzata.

Ecco un esempio tratto dall'app Impostazioni per 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>

Al momento del rendering, il frammento richiede un elenco di preferenze sia per le immagini statiche XML e impostazioni dinamiche definite in AndroidManifest. Indica se I valori PreferenceController sono definiti nel codice Java o in XML DashboardFragment gestisce la logica di gestione di ogni impostazione a PreferenceController (considerati di seguito). Quindi vengono visualizzate nell'interfaccia utente sotto forma di elenco misto.

PreferenceController

Ci sono differenze tra l'implementazione di PreferenceController su Android 9 e Android 8.x, come descritto .

PreferenceController nella release di Android 9

Un PreferenceController contiene tutta la logica per interagire con preferenza, tra cui visualizzazione, aggiornamento, indicizzazione della ricerca e così via.

L'interfaccia di PreferenceController è definita come BasePreferenceController. Ad esempio, vedi il codice packages/apps/Settings/src/com/android/settings/core/ BasePreferenceController.java

Esistono diverse sottoclassi di BasePreferenceController, ciascuna mappato a uno stile di UI specifico supportato per impostazione predefinita dall'app Impostazioni. Per Ad esempio, TogglePreferenceController ha un'API che mappa direttamente a come l'utente deve interagire con un'interfaccia utente preferita basata su attivazione/disattivazione.

BasePreferenceController offre API simili getAvailabilityStatus(), displayPreference() handlePreferenceTreeClicked(), e così via. Documentazione dettagliata per ogni L'API si trova nella classe dell'interfaccia.

Una limitazione relativa all'implementazione di BasePreferenceController (e le sue sottoclassi come TogglePreferenceController) è che la firma del costruttore deve corrispondere a uno dei seguenti:

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

Durante l'installazione di una preferenza per il frammento, la dashboard fornisce un metodo per allega un PreferenceController prima del tempo di visualizzazione. Al momento dell'installazione, il controller è collegato al frammento in modo che tutti gli eventi futuri pertinenti vengano inviate al controller.

DashboardFragment conserva un elenco di PreferenceController sullo schermo. All'inizio del frammento onCreate(), tutti i controller sono richiamati per getAvailabilityStatus() e, se restituisce true, displayPreference() viene richiamato per elaborare la logica di visualizzazione. getAvailabilityStatus() è importante anche indicare alle Impostazioni definire quali elementi sono disponibili durante la ricerca.

PreferenceController nelle release di Android 8.x

Un PreferenceController contiene tutta la logica per interagire con dei dati, tra cui visualizzazione, aggiornamento e indicizzazione della ricerca. ecc.

Corrispondenti alle interazioni delle preferenze, l'interfaccia di PreferenceController ha le API isAvailable(), displayPreference(), handlePreferenceTreeClicked() e così via. La documentazione dettagliata su ciascuna API è disponibile nella classe dell'interfaccia.

Durante l'installazione di una preferenza per il frammento, la dashboard fornisce un metodo per allega un PreferenceController prima del tempo di visualizzazione. Al momento dell'installazione, il controller è collegato al frammento in modo che tutti gli eventi futuri pertinenti vengano inviate al controller.

DashboardFragment mantiene un elenco di PreferenceControllers sullo schermo. In corrispondenza del valore onCreate() del frammento, tutti vengono richiamati per il metodo isAvailable() e, se restituisce true, displayPreference() viene richiamato per elaborare la visualizzazione logica.

Utilizza DashboardFragment

Spostare una preferenza dalla pagina A alla pagina B

Se la preferenza è elencata in modo statico nel file XML delle preferenze della pagina originale segui la procedura di spostamento statico per il tuo Android di seguito. In caso contrario, segui la procedura di spostamento Dinamico per la release di Android.

Spostamento statico in Android 9

  1. Trova i file XML delle preferenze per la pagina e la destinazione originali . Puoi trovare queste informazioni nel getPreferenceScreenResId().
  2. Rimuovi la preferenza dal file XML della pagina originale.
  3. Aggiungi la preferenza al file XML della pagina di destinazione.
  4. Rimuovi PreferenceController per questa preferenza dal l'implementazione Java della pagina originale. Di solito è in createPreferenceControllers(). Il controller può essere dichiarato XML direttamente.

    Nota: la preferenza potrebbe non includere un PreferenceController.

  5. Crea un'istanza per il campo PreferenceController nel tag createPreferenceControllers(). Se PreferenceController è definito in XML nella vecchia pagina, definiscilo in XML anche per la nuova pagina.

Trasloco dinamico in Android 9

  1. Trova la categoria ospitata dalla pagina originale e dalla pagina di destinazione. Puoi puoi trovare queste informazioni in DashboardFragmentRegistry.
  2. Apri il file AndroidManifest.xml che contiene l'impostazione spostalo e individua la voce Attività che rappresenta questa impostazione.
  3. Imposta il valore dei metadati dell'attività per com.android.settings.category alla chiave di categoria della nuova pagina.

Spostamento statico nelle release di Android 8.x

  1. Trova i file XML delle preferenze per la pagina originale e la pagina di destinazione.
  2. Puoi trovare queste informazioni tramite il metodo getPreferenceScreenResId() della pagina.
  3. Rimuovi la preferenza dal file XML della pagina originale.
  4. Aggiungi la preferenza al file XML della pagina di destinazione.
  5. Rimuovi PreferenceController per questa preferenza nel l'implementazione Java della pagina originale. Di solito è attivo getPreferenceControllers().
  6. Nota: è possibile che per la preferenza non sia associato un PreferenceController.

  7. Crea un'istanza per il campo PreferenceController nel tag getPreferenceControllers().

Lo spostamento dinamico nelle release di Android 8.x

  1. Trova la categoria ospitata dalla pagina originale e dalla pagina di destinazione. Puoi visualizzare queste informazioni in DashboardFragmentRegistry.
  2. Apri il file AndroidManifest.xml che contiene l'impostazione spostalo e individua la voce Attività che rappresenta questa impostazione.
  3. Modifica il valore dei metadati dell'attività per com.android.settings.category, imposta il punto valore sulla chiave di categoria della nuova pagina.

Creare una nuova preferenza in una pagina

Se la preferenza è elencata in modo statico nel file XML delle preferenze della pagina originale segui la procedura statica riportata di seguito. In caso contrario, segui le Dynamic.

Crea una preferenza statica

  1. Individua i file XML delle preferenze per la pagina. Puoi trovare queste informazioni dal metodo getPreferenceScreenResId() della pagina.
  2. Aggiungi un nuovo elemento Preferenza nel file XML. Assicurati che abbia un valore android:key univoco.
  3. Definisci un PreferenceController per questa preferenza nella sezione Metodo getPreferenceControllers().
    • In Android 8.x e facoltativamente in Android 9: crea un'istanza PreferenceController per questa preferenza nel metodo createPreferenceControllers() della pagina.

      Se questa preferenza esisteva già in altre posizioni, è possibile che ci siano già un PreferenceController. Puoi riutilizzare PreferenceController senza crearne uno nuovo.

    • A partire da Android 9, puoi scegliere di dichiarare PreferenceController in XML accanto alla preferenza. Ad esempio:
      <Preference
              android:key="reset_dashboard"
              android:title="@string/reset_dashboard_title"
              settings:controller="com.android.settings.system.ResetPreferenceController"/>
      

Creare una preferenza dinamica

  1. Trova la categoria ospitata dalla pagina originale e dalla pagina di destinazione. Puoi visualizzare queste informazioni in DashboardFragmentRegistry.
  2. Crea una nuova attività in AndroidManifest
  3. Aggiungi i metadati necessari alla nuova attività per definire l'impostazione. Imposta il parametro valore dei metadati per com.android.settings.category sullo stesso valore definita nel passaggio 1.

Crea una nuova pagina

  1. Crea un nuovo frammento, ereditando da DashboardFragment.
  2. Definisci la relativa categoria in DashboardFragmentRegistry.

    Nota: questo passaggio è facoltativo. Se non ti occorre preferenze dinamiche in questa pagina, non è necessario fornire una chiave di categoria.

  3. Segui i passaggi per aggiungere le impostazioni necessarie per questa pagina. Per ulteriori informazioni informazioni, consulta la sezione Implementazione.

Convalida

  • Esegui i test robolectrici nelle Impostazioni. Tutti i test nuovi ed esistenti devono vengono superate.
  • Crea e installa le impostazioni, quindi apri manualmente la pagina da modificare. La pagina dovrebbe aggiornarsi immediatamente.