Universelle Suche

Unter Android 8.0 wurden die Suchfunktionen im Menü Einstellungen erweitert. In diesem Dokument wird beschrieben, wie Sie eine Einstellung hinzufügen und dafür sorgen, dass sie ordnungsgemäß für die Suche in den Einstellungen indexiert wird.

Indexierbare Einstellungen erstellen

Jedes Einstellungsfragment, das indexiert werden muss, implementiert die Indexable-Schnittstelle UND erfordert das statische Feld:

public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER

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

Optionale Methoden

Diese SearchIndexProvider-Schnittstelle hat vier optionale Methoden.

getXmlResourcesToIndex

  • Überschreiben Sie dies, wenn Ihr Fragmentinhalt aus folgender Quelle stammt: preference xml
  • Gibt eine XML-Einstellung als zu indexierende Liste zurück.

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

  • Überschreibe dies, wenn dein Fragmentinhalt NICHT aus preference xml stammt.
  • 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 selten überschreiben.
  • Gibt eine Liste von Schlüsseln zurück, die Ergebnissen entsprechen, die für den angegebenen Nutzer, das Gerät, die Konfiguration usw. nicht angezeigt werden sollen. Die hier angegebenen Schlüssel sollten 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 indizierbare 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

Gibt eine Liste der Präferenz-Controller zurück, die mit diesem Fragment verknüpft sind. Diese Liste wird zum Erstellen von Inline-Ergebnissen, Aktualisieren nicht indizierbarer Daten usw. verwendet.

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

Keywords für Einstellungen hinzufügen

Damit eine Einstellung leicht zu finden ist, sollten Sie Suchbegriffe hinzufügen, die für die Einstellung relevant sind, mit der Nutzer nach der Einstellung suchen können.

Beachten Sie beim Hinzufügen von Keywords Folgendes:

  • Keywords sind eine Liste von Wörtern, die der Nutzer nicht unbedingt sieht, aber möglicherweise Teil des mentalen Modells für die Funktionsweise der Einstellung ist.
  • Dabei handelt es sich um Wörter, die der Nutzer eingeben kann, um zu Ihrer Einstellung zu gelangen.
  • Dabei kann es sich um Synonyme oder um Wörter handeln, die mit der Einstellung verknüpft sind.
  • Beispielsweise kann „Stummschalten“ verwendet werden, um die Einstellung für die Lautstärke zu finden.

Duplikate vermeiden

Wenn Sie eine Einstellungsseite bedingungslos unterdrücken, entfernen Sie die Indexierung der Originalseite, um doppelte Ergebnisse zu vermeiden.

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

Zertifizierungsstufe

So testen Sie die Sichtbarkeit einer neuen Einstellung:

  1. Installieren Sie eine aktuelle Version von O auf dem Gerät.
  2. Indexieren Sie die Datenbank neu, indem Sie Folgendes auswählen:
  3. Einstellungen > Apps & Benachrichtigungen > App-Info > 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 dieses 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