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
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:
- System pobiera treść wyszukiwanego hasła – to, co użytkownik zaczyna wpisywać, i wykona zapytanie do dostawcy treści, które zawiera Twoje sugestie.
- Twój dostawca treści zwraca błąd
Cursor
wskazujący wszystkie które pasują do tekstu wyszukiwanego hasła. - 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.