Ricerca universale

Android 8.0 aggiunge funzionalità di ricerca avanzate per il menu Impostazioni. Questo documento descrive come aggiungere un'impostazione e assicurarsi che sia indicizzata correttamente per la ricerca nelle Impostazioni.

Creare impostazioni indicizzate

Ogni frammento Impostazioni che deve essere indicizzato implementa l'Indexableinterfaccia E richiede il campo statico:

public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER

Dopo aver configurato il frammento per l'indicizzazione, aggiungilo a SearchIndexableResources disponibile all'indirizzo:
packages/apps/Settings/src/com/android/settings/search/SearchIndexableResources.java

Metodi facoltativi

Questa SearchIndexProviderinterfaccia ha quattro metodi facoltativi.

getXmlResourcesToIndex

  • Sostituisci questo valore se i contenuti del frammento provengono da: preference xml
  • Restituisce una preferenza XML come elenco da indicizzare.

Esempio di risorse XML:

public List<SearchIndexableResource> getXmlResourcesToIndex(Context context, boolean enabled) {
    ArrayList<SearchIndexableResource> result =  new ArrayList<SearchIndexableResource>();
SearchIndexableResource sir = new SearchIndexableResource(context);
	sir.xmlResId = R.xml.display_settings;
	result.add(sir);

    return result;
}

getRawDataToIndex

  • Sostituisci questo valore se i contenuti del frammento NON provengono da: preference xml
  • Restituisce un elenco di dati non elaborati (SearchIndexableRaw) da indicizzare.

Esempio di dati non elaborati:

public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) {
              final List<SearchIndexableRaw> result = new ArrayList<>();
              final Resources res = context.getResources();

              // Add fragment title
       SearchIndexableRaw data = new SearchIndexableRaw(context);
       data.title = res.getString(R.string.wifi_settings);
       data.screenTitle = res.getString(R.string.wifi_settings);
       data.keywords = res.getString(R.string.keywords_wifi);
       data.key = DATA_KEY_REFERENCE;
       result.add(data);

       return result;
}

getNonIndexableKeys

  • Se il frammento è DashboardFragment, raramente è necessario override.
  • Restituisce un elenco di chiavi che corrispondono ai risultati che non devono essere visualizzati per l'utente, il dispositivo, la configurazione e così via specificati.Le chiavi fornite qui devono corrispondere al campo KEY in SearchIndexableResource e SearchIndexableRaw.
  • Ad esempio, l'utilizzo dei dati non deve essere visualizzato per gli utenti che non hanno mai avuto una scheda SIM nel proprio dispositivo.

Esempio di chiavi non indicizzate:

public List<String> getNonIndexableKeys(Context context) {
      final List<String> keys = super.getNonIndexableKeys(context);
              if (!checkIntentAction(context, "android.settings.TERMS")) {
                  keys.add(KEY_TERMS);
              }
              if (!checkIntentAction(context, "android.settings.LICENSE")) {
                  keys.add(KEY_LICENSE);
              }
              if (!checkIntentAction(context, "android.settings.COPYRIGHT")) {
                  keys.add(KEY_COPYRIGHT);
              }
              if (!checkIntentAction(context, "android.settings.WEBVIEW_LICENSE")) {
                  keys.add(KEY_WEBVIEW_LICENSE);
              }
              return keys;
}

getPreferenceControllers

Restituisce un elenco di controller delle preferenze associati a questo frammento. Questo elenco viene utilizzato per formare risultati in linea, aggiornare elementi non indicizzati e così via.

Pertanto, tutto ciò che vuoi mostrare nella Ricerca deve essere incluso in getXmlResourcesToIndex o getRawDataToIndex.

Aggiungere parole chiave per le impostazioni

Per assicurarti che un'impostazione sia facilmente ricercabile, aggiungi parole chiave pertinenti per l'impostazione che un utente potrebbe utilizzare per cercarla.

Aspetti da considerare quando aggiungi parole chiave:

  • Le parole chiave sono un elenco di parole che l'utente non vede necessariamente, ma che possono far parte del suo modello mentale del funzionamento dell'impostazione.
  • Si tratta di parole che l'utente potrebbe digitare per accedere all'impostazione.
  • Possono essere sinonimi o qualsiasi parola associata all'impostazione.
  • Ad esempio, potresti usare "disattiva l'audio" per trovare l'impostazione del volume.

Evitare la duplicazione

Se stai sopprimendo incondizionatamente una pagina di impostazioni, rimuovi l'indicizzazione della pagina originale per evitare la duplicazione dei risultati.

  1. Trova il PreferenceFragment della pagina che vuoi eliminare.
  2. Rimuovi SearchIndexProvider.

Convalida

Per verificare la ricercabilità di una nuova impostazione:

  1. Installa una versione recente di O sul dispositivo.
  2. Esegui nuovamente l'indicizzazione del database selezionando:
  3. Impostazioni > App e notifiche > Informazioni app > Impostazioni > Spazio di archiviazione > Cancella dati
  4. Verifica che le impostazioni del target vengano visualizzate nella ricerca.
    La ricerca di un prefisso del titolo di un'impostazione corrisponderà a questa.

Per convalidare l'implementazione di questa funzionalità, è possibile eseguire questi test robolectric:
packages/apps/Settings/tests/robotests/src/com/android/settings/search

Il target di compilazione è: RunSettingsRoboTests