Dodawanie niestandardowych sugestii wyszukiwania

Możesz podać sugestie wyszukiwania na podstawie ostatnich zapytań w oknie wyszukiwania na Androidzie lub widżet wyszukiwania. Jeśli np. użytkownik wyszukuje hasło „szczeniaki”, zapytanie pojawia się jako sugestia, gdy ponownie wpisać to samo zapytanie. Rysunek 1 przedstawia przykład okna wyszukiwania z ostatnim zapytaniem sugestie.

Zanim zaczniesz, zaimplementuj okno wyszukiwania lub widżet wyszukiwania do wyszukiwania podstawowego w Twojej aplikacji. Aby dowiedzieć się, jak to zrobić, przeczytaj artykuł Utwórz interfejs wyszukiwania.

Podstawy

Rysunek 1. Zrzut ekranu przedstawiający okno wyszukiwania z ostatnim zapytaniem sugestie.

Ostatnie sugestie zapytań to zapisane wyszukiwania. Gdy użytkownik wybierze sugestię, pojawi się działanie otrzymuje Intencja ACTION_SEARCH z podpowiedź jako zapytaniem, które jest już obsługiwane przez aktywność związaną z wyszukiwaniem.

Aby wyświetlić sugestie dotyczące ostatnich zapytań, musisz:

  • Zaimplementuj aktywność z możliwością wyszukiwania.
  • Utwórz dostawcę treści, który obejmuje SearchRecentSuggestionsProvider i zadeklaruj ją w pliku manifestu aplikacji.
  • Zmodyfikuj konfigurację wyszukiwania, dodając informacje o dostawcy treści, który udostępnia sugestie wyszukiwania.
  • Zapisuj zapytania w systemie dostawcy treści po każdym wyszukiwaniu.

Podobnie jak w systemie Android okno wyszukiwania wyświetla się w podanych niżej sugestiach wyszukiwania w oknie dialogowym lub w widżecie wyszukiwania. Musisz podać źródło, z którego system ma pobierać sugestie.

Gdy system wykryje, że aktywność można przeszukiwać, i wyświetli sugestie wyszukiwania, następujące działania mają miejsce, gdy użytkownik wpisze zapytanie:

  1. System pobiera treść wyszukiwanego hasła – to, co użytkownik zaczyna wpisywać, i wykona zapytanie do dostawcy treści, które zawiera Twoje sugestie.
  2. Twój dostawca treści zwraca błąd Cursor wskazujący wszystkie które pasują do tekstu wyszukiwanego hasła.
  3. System wyświetli listę sugestii dostarczonej przez Cursor.

Po wyświetleniu ostatnich sugestii zapytań mogą wystąpić te sytuacje:

  • Jeśli użytkownik wpisze inny klucz lub w jakikolwiek sposób zmieni zapytanie, poprzednie kroki zostaną powtórz, a lista sugestii zostanie zaktualizowana.
  • Jeśli użytkownik wykona wyszukiwanie, sugestie zostaną zignorowane, a wyszukiwanie zostanie dostarczone do Twoją aktywność do przeszukiwania przy użyciu normalnej intencji ACTION_SEARCH.
  • Jeśli użytkownik wybierze sugestię, intencja ACTION_SEARCH zostanie dostarczona aktywność, którą można przeszukiwać, używając sugerowanego tekstu jako zapytania.

Klasa SearchRecentSuggestionsProvider rozszerzona dla dostawcy treści automatycznie wykonuje pracę w poprzednich krokach, więc niewiele kodu potrzeba do napisania.

Utwórz dostawcę treści

Dostawca treści potrzebny do wyświetlania sugestii dotyczących ostatnich zapytań to implementacja SearchRecentSuggestionsProvider Te zajęcia zrobią za Ciebie wszystko. Wystarczy, że: Napisać konstruktor klas, który wykonuje jeden wiersz kodu.

Oto pełna implementacja dostawcy treści dla ostatniego zapytania sugestie:

Kotlin

class MySuggestionProvider : SearchRecentSuggestionsProvider() {
    init {
        setupSuggestions(AUTHORITY, MODE)
    }

    companion object {
        const val AUTHORITY = "com.example.MySuggestionProvider"
        const val MODE: Int = SearchRecentSuggestionsProvider.DATABASE_MODE_QUERIES
    }
}

Java

public class MySuggestionProvider extends SearchRecentSuggestionsProvider {
    public final static String AUTHORITY = "com.example.MySuggestionProvider";
    public final static int MODE = DATABASE_MODE_QUERIES;

    public MySuggestionProvider() {
        setupSuggestions(AUTHORITY, MODE);
    }
}

Wezwanie do działania setupSuggestions() przekazuje nazwę urzędu wyszukiwania i tryb bazy danych. Uprawnienie wyszukiwania może być dowolną unikalną ale najlepszą metodą jest użycie pełnej i jednoznacznej nazwy dostawcy treści, takiej jak nazwę pakietu, a po niej nazwę klasy dostawcy. Przykład: "com.example.MySuggestionProvider"

Tryb bazy danych musi zawierać DATABASE_MODE_QUERIES i opcjonalnie uwzględnić DATABASE_MODE_2LINES, co dodaje kolumnę do tabeli sugestii, w której można podać drugi wiersz tekstu sugestii. Jeśli chcesz podać 2 wiersze w każdej sugestii, skorzystaj z tego przykładu:

Kotlin

const val MODE: Int = DATABASE_MODE_QUERIES or DATABASE_MODE_2LINES

Java

public final static int MODE = DATABASE_MODE_QUERIES | DATABASE_MODE_2LINES;

Zadeklaruj dostawcę treści w pliku manifestu aplikacji, podając ten sam ciąg znaków dotyczący urzędu certyfikacji używany w polu SearchRecentSuggestionsProvider i konfiguracji, którą można przeszukiwać. Dla: przykład:

<application>
    <provider android:name=".MySuggestionProvider"
              android:authorities="com.example.MySuggestionProvider" />
    ...
</application>

Modyfikowanie konfiguracji umożliwiającej wyszukiwanie

Aby skonfigurować system do korzystania z dostawcy sugestii, dodaj parametr android:searchSuggestAuthority i android:searchSuggestSelection do elementu <searchable> w dostępnym do przeszukiwania pliku konfiguracji. Dla: przykład:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_label"
    android:hint="@string/search_hint"
    android:searchSuggestAuthority="com.example.MySuggestionProvider"
    android:searchSuggestSelection=" ?" >
</searchable>

Wartość pola android:searchSuggestAuthority musi być pełną i jednoznaczną nazwą Twojego konta dostawcy treści dokładnie odpowiadającego urzędowi dostawcy, np. "com.example.MySuggestionProvider" w poprzednich przykładach.

Wartość pola android:searchSuggestSelection musi być poprzedzony pojedynczym znakiem zapytania przy pokoju: " ?". Jest to obiekt zastępczy argumentu wyboru SQLite. automatycznie zastąpione tekstem zapytania wprowadzonym przez użytkownika.

Zapisz zapytania

Aby zapełnić kolekcję ostatnich zapytań, dodaj wszystkie zapytania otrzymane przez aktywność na urządzeniu SearchRecentSuggestionsProvider. Aby to zrobić, utwórz instancję usługi SearchRecentSuggestions i zadzwoń saveRecentQuery() za każdym razem, gdy aktywność dostępna dla wyszukiwarki otrzymuje zapytanie. Aby zapisać zapytanie, użyj np. tak w trakcie onCreate() :

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main)

    if (Intent.ACTION_SEARCH == intent.action) {
        intent.getStringExtra(SearchManager.QUERY)?.also { query ->
            SearchRecentSuggestions(this, MySuggestionProvider.AUTHORITY, MySuggestionProvider.MODE)
                    .saveRecentQuery(query, null)
        }
    }
}

Java

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Intent intent  = getIntent();

    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        String query = intent.getStringExtra(SearchManager.QUERY);
        SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
                MySuggestionProvider.AUTHORITY, MySuggestionProvider.MODE);
        suggestions.saveRecentQuery(query, null);
    }
}

Konstruktor SearchRecentSuggestionsProvider wymaga funkcji trybu uwierzytelniania i bazy danych zadeklarowanego przez dostawcę treści.

Metoda saveRecentQuery() przyjmuje ciąg zapytania jako pierwszy parametr i opcjonalnie drugi ciąg do uwzględnienia jako drugi wiersz sugestii lub wartości null. Druga jest używany tylko wtedy, gdy włączysz tryb dwuwierszowy dla sugestii wyszukiwania z atrybutem DATABASE_MODE_2LINES Jeśli włączysz tryb dwuwierszowy, tekst zapytania będzie dopasowywany do w drugim wierszu, gdy system szuka pasujących sugestii.

Wyczyść dane sugestii

Aby chronić prywatność użytkownika, zawsze zapewniaj mu możliwość usunięcia ostatniego zapytania sugestie. Aby wyczyścić historię zapytań, wywołaj clearHistory() Na przykład:

Kotlin

SearchRecentSuggestions(this, HelloSuggestionsProvider.AUTHORITY, HelloSuggestionsProvider.MODE)
        .clearHistory()

Java

SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
        HelloSuggestionProvider.AUTHORITY, HelloSuggestionProvider.MODE);
suggestions.clearHistory();

Wykonaj to działanie z opcji „Wyczyść historię wyszukiwania” element menu, element preferencji lub przycisk. Wyświetl okno z potwierdzeniem, że użytkownik chce usunąć swoją historię wyszukiwania.