Możesz podawać sugestie wyszukiwania na podstawie ostatnich zapytań w oknie wyszukiwania na Androidzie lub w widżecie wyszukiwania. Jeśli na przykład użytkownik wpisze zapytanie „szczenięta”, pojawi się ono jako sugestia, gdy ponownie wpisze to samo zapytanie. Ilustracja 1 przedstawia przykładowe okno wyszukiwania z sugestiami dotyczącymi ostatnich zapytań.
Zanim zaczniesz, wdróż w aplikacji okno wyszukiwania lub widżet wyszukiwania do podstawowych wyszukiwań. Więcej informacji znajdziesz w artykule Tworzenie interfejsu wyszukiwania.
Podstawy

Rysunek 1. Zrzut ekranu przedstawiający okno wyszukiwania z sugestiami dotyczącymi ostatnich zapytań.
Sugerowane ostatnie zapytania to zapisane wyszukiwania. Gdy użytkownik wybierze sugestię, Twoja aktywność z możliwością wyszukiwania otrzyma intencję ACTION_SEARCH
z sugestią jako zapytaniem, które jest już obsługiwane przez Twoją aktywność z możliwością wyszukiwania.
Aby wyświetlać sugestie dotyczące ostatnich zapytań, musisz:
- Zaimplementuj aktywność, którą można wyszukiwać.
- Utwórz dostawcę treści, który rozszerza klasę
SearchRecentSuggestionsProvider
i zadeklaruj go w manifeście aplikacji. - Zmodyfikuj konfigurację wyszukiwania, podając informacje o dostawcy treści, który udostępnia sugestie wyszukiwania.
- Zapisywanie zapytań u dostawcy treści za każdym razem, gdy zostanie wykonane wyszukiwanie.
Podobnie jak w przypadku okna wyszukiwania, system Android wyświetla sugestie wyszukiwania poniżej okna lub widżetu wyszukiwania. Ty podajesz źródło, z którego system pobiera sugestie.
Gdy system wykryje, że Twoja aktywność jest wyszukiwalna i wyświetla sugestie wyszukiwania, po wpisaniu przez użytkownika zapytania następuje:
- System pobiera tekst zapytania – wszystko, co użytkownik zaczyna wpisywać – i wysyła zapytanie do dostawcy treści, które zawiera Twoje sugestie.
- Dostawca treści zwraca
Cursor
, który wskazuje wszystkie sugestie pasujące do tekstu zapytania. - System wyświetli listę sugestii podanych przez
Cursor
.
Gdy wyświetlą się sugestie dotyczące ostatnich zapytań, może się zdarzyć:
- Jeśli użytkownik wpisze inny klawisz lub w jakikolwiek sposób zmieni zapytanie, poprzednie kroki zostaną powtórzone, a lista sugestii zostanie zaktualizowana.
- Jeśli użytkownik przeprowadzi wyszukiwanie, sugestie zostaną zignorowane, a wyszukiwanie zostanie przekazane do Twojej aktywności z możliwością wyszukiwania za pomocą zwykłego intencji
ACTION_SEARCH
. - Jeśli użytkownik wybierze sugestię, do Twojej aktywności z możliwością wyszukiwania zostanie dostarczony intencja
ACTION_SEARCH
z sugerowanym tekstem jako zapytaniem.
SearchRecentSuggestionsProvider
klasa, którą rozszerzasz na potrzeby dostawcy treści, automatycznie wykonuje czynności opisane w poprzednich krokach, więc nie musisz pisać dużo kodu.
Tworzenie dostawcy treści
Dostawca treści, którego potrzebujesz do sugestii dotyczących ostatnich zapytań, to implementacja interfejsu SearchRecentSuggestionsProvider
. Ta klasa zrobi wszystko za Ciebie. Wystarczy, że napiszesz konstruktor klasy, który wykonuje jeden wiersz kodu.
Oto na przykład pełna implementacja dostawcy treści dla sugestii dotyczących ostatnich zapytań:
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); } }
Wywołanie funkcji setupSuggestions()
przekazuje nazwę organu wyszukiwania i tryb bazy danych. Władza wyszukiwania może być dowolnym unikalnym ciągiem znaków, ale najlepszym rozwiązaniem jest użycie w przypadku dostawcy treści w pełni kwalifikowanej nazwy, np. nazwy pakietu, po której następuje nazwa klasy dostawcy. Na przykład:"com.example.MySuggestionProvider"
.
Tryb bazy danych musi zawierać
DATABASE_MODE_QUERIES
i może opcjonalnie zawierać
DATABASE_MODE_2LINES
,
który dodaje kolumnę do tabeli sugestii, dzięki czemu możesz podać drugi wiersz tekstu z każdą sugestią. Jeśli chcesz podać 2 wiersze w każdej sugestii, zapoznaj się z tym przykładem:
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, używając tego samego ciągu autoryzacji, który został użyty w klasie SearchRecentSuggestionsProvider
i w konfiguracji wyszukiwania. Przykład:
<application> <provider android:name=".MySuggestionProvider" android:authorities="com.example.MySuggestionProvider" /> ... </application>
Zmień konfigurację możliwości wyszukiwania
Aby skonfigurować system tak, aby korzystał z dostawcy sugestii, dodaj atrybuty android:searchSuggestAuthority
i android:searchSuggestSelection
do elementu <searchable>
w pliku konfiguracyjnym z możliwością wyszukiwania. 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ść parametru android:searchSuggestAuthority
musi być w pełni kwalifikowaną nazwą dostawcy treści, która jest identyczna z używaną przez niego nazwą, np. "com.example.MySuggestionProvider"
w przykładach powyżej.
Wartość parametru android:searchSuggestSelection
musi być pojedynczym znakiem zapytania poprzedzonym spacją: " ?"
. Jest to symbol zastępczy argumentu wyboru SQLite, który jest automatycznie zastępowany tekstem zapytania wpisanym przez użytkownika.
Zapisywanie zapytań
Aby wypełnić kolekcję ostatnich zapytań, dodaj każde zapytanie otrzymane przez aktywność, w której można wyszukiwać, do elementu SearchRecentSuggestionsProvider
. Aby to zrobić, utwórz instancję
SearchRecentSuggestions
i wywołaj
saveRecentQuery()
za każdym razem, gdy aktywność, w której można wyszukiwać, otrzyma zapytanie. Na przykład tak możesz zapisać zapytanie podczas wykonywania metody onCreate()
aktywności:
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 tego samego trybu autoryzacji i bazy danych, który został zadeklarowany przez dostawcę treści.
Metoda saveRecentQuery()
przyjmuje ciąg zapytania jako pierwszy parametr i opcjonalnie drugi ciąg, który ma być uwzględniony jako drugi wiersz sugestii, lub wartość null. Drugi parametr jest używany tylko wtedy, gdy włączysz tryb dwuwierszowy dla sugestii wyszukiwania za pomocą parametru DATABASE_MODE_2LINES
. Jeśli włączysz tryb dwuwierszowy, tekst zapytania będzie dopasowywany do drugiego wiersza, gdy system będzie szukać pasujących sugestii.
Wyczyść dane sugestii
Aby chronić prywatność użytkownika, zawsze udostępniaj mu możliwość wyczyszczenia ostatnich sugestii zapytań. 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();
Zrób to, wybierając element menu „Wyczyść historię wyszukiwania”, element preferencji lub przycisk. Wyświetl okno potwierdzenia, aby sprawdzić, czy użytkownik chce usunąć historię wyszukiwania.