Universelle Suche

Android 8.0 bietet erweiterte Suchfunktionen für das Menü Einstellungen. In diesem Dokument wird beschrieben, wie Sie eine Einstellung hinzufügen und dafür sorgen, dass sie für die Einstellungssuche richtig indexiert wird.

Indexierbare Einstellungen erstellen

Jedes zu indexierende Einstellungsfragment implementiert die Indexable-Schnittstelle UND erfordert das statische Feld:

public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER

Nachdem Sie das Fragment für die Indexierung eingerichtet haben, fügen Sie es SearchIndexableResources unter
packages/apps/Settings/src/com/android/settings/search/SearchIndexableResources.java hinzu.

Optionale Methoden

Diese SearchIndexProvider-Schnittstelle hat vier optionale Methoden.

getXmlResourcesToIndex

  • Überschreiben Sie diese Einstellung, wenn die Fragmentinhalte aus folgenden Quellen stammen: preference xml
  • Gibt eine XML-Einstellung als Liste zurück, die indexiert werden soll.

Beispiel für XML-Ressourcen:

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

  • Überschreiben Sie diese Einstellung, wenn die Fragmentinhalte NICHT von folgenden Quellen stammen: preference xml
  • Gibt eine Liste der zu indexierenden Rohdaten (SearchIndexableRaw) zurück.

Beispiel für Rohdaten:

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

  • Wenn Ihr Fragment ein DashboardFragment ist, müssen Sie dies nur selten überschreiben.
  • Hiermit wird eine Liste von Schlüsseln zurückgegeben, die Ergebnissen entsprechen, die für den angegebenen Nutzer, das angegebene Gerät, die angegebene Konfiguration usw. nicht angezeigt werden sollten. Die hier angegebenen Schlüssel müssen mit dem Feld KEY in SearchIndexableResource und SearchIndexableRaw übereinstimmen.
  • Beispiel: Die Datennutzung sollte nicht für Nutzer angezeigt werden, die noch nie eine SIM-Karte in ihrem Gerät hatten.

Beispiel für nicht indexierbare Schlüssel:

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

Eine Liste der Einstellungscontroller, die mit diesem Fragment verknüpft sind. Diese Liste wird verwendet, um Inline-Ergebnisse zu erstellen, nicht indexierbare Elemente zu aktualisieren usw.

Daher muss alles, was in der Suche angezeigt werden soll, entweder in getXmlResourcesToIndex oder getRawDataToIndex enthalten sein.

Keywords für Ihre Einstellungen hinzufügen

Damit eine Einstellung leicht zu finden ist, fügen Sie Keywords hinzu, die für die Einstellung relevant sind und mit denen Nutzer nach der Einstellung suchen können.

Wichtige Aspekte beim Hinzufügen von Keywords:

  • Keywords sind eine Liste von Wörtern, die der Nutzer nicht unbedingt sieht, die aber Teil seines mentalen Modells für die Funktionsweise der Einstellung sein können.
  • Das sind Wörter, die der Nutzer eingeben könnte, um die Einstellung aufzurufen.
  • Es können Synonyme oder beliebige mit der Einstellung verknüpfte Wörter verwendet werden.
  • Sie können beispielsweise „stummschalten“ sagen, um die Lautstärkeeinstellung zu finden.

Duplikate vermeiden

Wenn Sie eine Einstellungsseite bedingungslos unterdrücken, entfernen Sie die Indexierung der Originalseite, um Duplikate von Ergebnissen zu vermeiden.

  1. Suchen Sie die PreferenceFragment der Seite, die Sie unterdrücken möchten.
  2. Entfernen Sie SearchIndexProvider.

Zertifizierungsstufe

So testen Sie die Suchbarkeit einer neuen Einstellung:

  1. Installieren Sie eine aktuelle Version von O auf dem Gerät.
  2. Wählen Sie eine der folgenden Optionen aus, um die Datenbank neu zu indexieren:
  3. Einstellungen > Apps & Benachrichtigungen > App-Informationen > Einstellungen > Speicher > Daten löschen
  4. Prüfen Sie, ob die Zieleinstellungen in der Suche angezeigt werden.
    Wenn Sie nach einem Präfix des Titels einer Einstellung suchen, wird eine Übereinstimmung gefunden.

Diese Robolectric-Tests können ausgeführt werden, um die Implementierung dieser Funktion zu validieren:
packages/apps/Settings/tests/robotests/src/com/android/settings/search

Das Build-Ziel ist: RunSettingsRoboTests