Anda dapat memberikan saran penelusuran berdasarkan kueri penelusuran terbaru di dialog penelusuran atau widget penelusuran Android. Misalnya, jika pengguna membuat kueri "anak anjing", kueri akan muncul sebagai saran saat mereka mengetik lagi kueri yang sama. Gambar 1 menunjukkan contoh dialog penelusuran dengan saran kueri terbaru.
Sebelum memulai, terapkan dialog penelusuran atau widget penelusuran untuk penelusuran dasar dalam aplikasi Anda. Untuk mempelajari caranya, lihat Membuat antarmuka penelusuran.
Dasar-dasar
Saran kueri terbaru adalah penelusuran tersimpan. Saat pengguna memilih sebuah saran, aktivitas
penelusuran Anda akan menerima
intent ACTION_SEARCH
dengan saran tersebut sebagai kueri penelusuran yang telah ditangani oleh aktivitas penelusuran Anda.
Untuk memberikan saran kueri terbaru, Anda perlu:
- Menerapkan aktivitas penelusuran.
- Buat penyedia konten yang memperluas
SearchRecentSuggestionsProvider
dan deklarasikan dalam manifes aplikasi Anda. - Ubah konfigurasi penelusuran dengan informasi tentang penyedia konten yang menyediakan saran penelusuran.
- Menyimpan kueri ke penyedia konten setiap kali penelusuran dijalankan.
Seperti halnya menampilkan dialog penelusuran, sistem Android juga menampilkan saran penelusuran di bawah dialog atau widget penelusuran. Anda harus memasukkan sumber yang akan digunakan sistem untuk mengambil saran.
Saat sistem mengidentifikasi bahwa aktivitas Anda dapat ditelusuri dan memberikan saran penelusuran, hal berikut akan terjadi saat pengguna mengetik kueri:
- Sistem mengambil teks kueri penelusuran—apa pun yang mulai diketik pengguna—dan mengirimkan kueri ke penyedia konten yang memuat saran Anda.
- Penyedia konten akan menampilkan
Cursor
yang mengarah ke semua saran yang cocok dengan teks kueri penelusuran. - Sistem menampilkan daftar saran yang diberikan oleh
Cursor
.
Setelah saran kueri terbaru ditampilkan, berikut ini dapat terjadi:
- Jika pengguna mengetik kunci lain atau mengubah kueri dengan cara apa pun, langkah di atas akan diulang dan daftar saran akan diperbarui.
- Jika pengguna menjalankan penelusuran, saran akan diabaikan dan penelusuran akan dikirimkan ke
aktivitas penelusuran Anda menggunakan intent
ACTION_SEARCH
normal. - Jika pengguna memilih sebuah saran, intent
ACTION_SEARCH
akan dikirimkan ke aktivitas penelusuran Anda menggunakan teks yang disarankan sebagai kueri.
Class SearchRecentSuggestionsProvider
yang Anda perluas untuk penyedia konten
akan otomatis melakukan tugas pada langkah sebelumnya, sehingga sedikit kode yang harus ditulis.
Membuat penyedia konten
Penyedia konten yang Anda perlukan untuk saran kueri terbaru adalah implementasi
SearchRecentSuggestionsProvider
. Kelas ini melakukan segalanya untuk Anda. Anda hanya perlu
menulis konstruktor class yang mengeksekusi satu baris kode.
Misalnya, berikut adalah implementasi lengkap penyedia konten untuk saran kueri terbaru:
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); } }
Panggilan ke
setupSuggestions()
akan meneruskan nama otoritas penelusuran dan mode database. Otoritas penelusuran dapat berupa string unik apa pun, tetapi praktik terbaiknya adalah menggunakan nama yang sepenuhnya memenuhi syarat untuk penyedia konten Anda, seperti
nama paket yang diikuti dengan nama class penyedia. Misalnya, "com.example.MySuggestionProvider"
.
Mode database harus menyertakan
DATABASE_MODE_QUERIES
dan secara opsional dapat menyertakan
DATABASE_MODE_2LINES
,
yang menambahkan kolom ke tabel saran sehingga Anda dapat menyediakan baris teks kedua dengan setiap
saran. Jika Anda ingin memberikan dua baris di setiap saran, lihat contoh berikut:
Kotlin
const val MODE: Int = DATABASE_MODE_QUERIES or DATABASE_MODE_2LINES
Java
public final static int MODE = DATABASE_MODE_QUERIES | DATABASE_MODE_2LINES;
Deklarasikan penyedia konten dalam manifes aplikasi Anda dengan string otoritas yang sama dengan yang digunakan di
class SearchRecentSuggestionsProvider
dan dalam konfigurasi penelusuran. Contoh:
<application> <provider android:name=".MySuggestionProvider" android:authorities="com.example.MySuggestionProvider" /> ... </application>
Mengubah konfigurasi penelusuran
Untuk mengonfigurasi sistem agar menggunakan penyedia saran Anda, tambahkan
atribut android:searchSuggestAuthority
dan android:searchSuggestSelection
ke elemen <searchable>
dalam file konfigurasi penelusuran Anda. Contoh:
<?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>
Nilai untuk android:searchSuggestAuthority
harus berupa nama yang sepenuhnya memenuhi syarat untuk
penyedia konten Anda, yang sama persis dengan otoritas yang digunakan di penyedia konten, seperti
"com.example.MySuggestionProvider"
dalam contoh sebelumnya.
Nilai untuk android:searchSuggestSelection
harus berupa tanda tanya tunggal yang diawali
dengan spasi: " ?"
. Ini adalah placeholder untuk argumen pemilihan SQLite, dan
otomatis diganti oleh teks kueri yang dimasukkan oleh pengguna.
Simpan kueri
Untuk mengisi kumpulan kueri terbaru, tambahkan setiap kueri yang diterima oleh aktivitas penelusuran
ke SearchRecentSuggestionsProvider
. Untuk melakukannya, buat instance
SearchRecentSuggestions
dan panggil
saveRecentQuery()
setiap kali aktivitas penelusuran Anda menerima kueri. Misalnya, berikut ini cara menyimpan kueri
selama metode
onCreate()
aktivitas Anda:
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
memerlukan otoritas dan mode database yang sama dengan yang dideklarasikan oleh penyedia konten Anda.
Metode saveRecentQuery()
akan mengambil string kueri penelusuran sebagai parameter pertama dan, secara opsional, string kedua untuk disertakan sebagai baris kedua saran atau null. Parameter kedua hanya digunakan jika Anda mengaktifkan mode dua baris untuk saran penelusuran dengan DATABASE_MODE_2LINES
. Jika Anda mengaktifkan mode dua baris, teks kueri akan cocok dengan
baris kedua saat sistem mencari saran yang cocok.
Hapus data saran
Untuk melindungi privasi pengguna, selalu sediakan cara bagi pengguna untuk menghapus saran kueri
terbaru. Untuk menghapus histori kueri, panggil clearHistory()
.
Contoh:
Kotlin
SearchRecentSuggestions(this, HelloSuggestionsProvider.AUTHORITY, HelloSuggestionsProvider.MODE) .clearHistory()
Java
SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this, HelloSuggestionProvider.AUTHORITY, HelloSuggestionProvider.MODE); suggestions.clearHistory();
Jalankan ini dari tombol, item preferensi, atau item menu "Hapus Histori Penelusuran" pilihan Anda. Berikan dialog konfirmasi untuk memverifikasi bahwa pengguna ingin menghapus histori penelusurannya.