Universelle Suche

Android 8.0 fügt erweiterte Suchfunktionen für das Einstellungsmenü hinzu. In diesem Dokument wird beschrieben, wie Sie eine Einstellung hinzufügen und sicherstellen, dass sie für die Einstellungssuche ordnungsgemäß indiziert wird.

Indexierbare Einstellungen erstellen

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

public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER

Sobald Sie Ihr Fragment für die Indizierung eingerichtet haben, fügen Sie es zu SearchIndexableResources hinzu, das Sie unter folgender Adresse finden:
packages/apps/Settings/src/com/android/settings/search/SearchIndexableResources.java

Optionale Methoden

Diese SearchIndexProvider Schnittstelle verfügt über vier optionale Methoden.

getXmlResourcesToIndex

  • Überschreiben Sie dies, wenn Ihr Fragmentinhalt aus: preference xml stammt
  • Gibt eine XML-Präferenz als zu indizierende 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

  • Überschreiben Sie dies, wenn Ihr Fragmentinhalt NICHT aus: preference xml stammt
  • Gibt eine Liste der zu indizierenden 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 Benutzer, das angegebene Gerät, die angegebene Konfiguration usw. nicht angezeigt werden sollten. Die hier bereitgestellten Schlüssel sollten mit dem KEY- Feld in SearchIndexableResource und SearchIndexableRaw übereinstimmen.
  • Beispiel: „Datennutzung“ sollte nicht für Benutzer 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 von Präferenz-Controllern zurück, die diesem Fragment zugeordnet sind. Diese Liste wird verwendet, um Inline-Ergebnisse zu erstellen, nicht indizierbare Elemente zu aktualisieren usw.

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

Hinzufügen von Schlüsselwörtern für Ihre Einstellungen

Um sicherzustellen, dass eine Einstellung leicht durchsuchbar ist, fügen Sie für die Einstellung relevante Schlüsselwörter hinzu, mit denen ein Benutzer nach der Einstellung suchen kann.

Was Sie beim Hinzufügen von Schlüsselwörtern beachten sollten:

  • Schlüsselwörter sind eine Liste von Wörtern, die der Benutzer nicht unbedingt sieht, aber möglicherweise Teil seines mentalen Modells für die Funktionsweise der Einstellung sind.
  • Dies sind Wörter, die der Benutzer möglicherweise eingeben muss, um zu Ihrer Einstellung zu gelangen.
  • Dabei kann es sich um Synonyme handeln oder es können beliebige mit der Einstellung verknüpfte Wörter verwendet werden.
  • Beispielsweise könnte „Stumm“ verwendet werden, um die Lautstärkeeinstellung zu finden.

Vermeidung von Doppelarbeit

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

  1. Suchen Sie das PreferenceFragment der Seite, die Sie unterdrücken.
  2. Entfernen Sie den SearchIndexProvider .

Validierung

So testen Sie die Durchsuchbarkeit einer neuen Einstellung:

  1. Installieren Sie eine aktuelle Version von O auf dem Gerät.
  2. Indizieren Sie die Datenbank neu, indem Sie Folgendes auswählen:
  3. Einstellungen > Apps & Benachrichtigungen > Apps-Info > Einstellungen > Speicher > Daten löschen
  4. Überprüfen Sie, ob die Zieleinstellungen in der Suche angezeigt werden.
    Wenn Sie nach einem Präfix des Titels einer Einstellung suchen, wird dieser gefunden.

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

Das Build-Ziel ist: RunSettingsRoboTests