Menyiapkan antarmuka penelusuran

Sebaiknya gunakan SearchView sebagai item di panel aplikasi untuk menyediakan fungsi penelusuran di aplikasi Anda. Sebagai dengan semua item di panel aplikasi, Anda dapat menentukan SearchView untuk ditampilkan setiap saat atau hanya ketika tersedia ruang. Anda juga dapat mendefinisikannya sebagai tindakan yang dapat diciutkan, yang menampilkan SearchView sebagai ikon awalnya dan kemudian menggunakan seluruh bilah aplikasi sebagai {i>field<i} pencarian ketika pengguna mengetuk ikon.

Menambahkan SearchView ke panel aplikasi

Untuk menambahkan widget SearchView ke panel aplikasi, buat file di project bernama res/menu/options_menu.xml dan tambahkan kode berikut ke file. Kode ini menentukan cara membuat item penelusuran, seperti ikon digunakan dan judul item. Atribut collapseActionView memungkinkan SearchView Anda meluas untuk mengisi seluruh panel aplikasi dan menciutkan kembali ke item panel aplikasi normal saat tidak digunakan. Karena ruang bilah aplikasi yang terbatas di perangkat handset, sebaiknya gunakan Atribut collapsibleActionView untuk menyediakan pengguna yang lebih baik pengalaman yang lancar bagi developer.

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/search"
        android:title="@string/search_title"
        android:icon="@drawable/ic_search"
        android:showAsAction="collapseActionView|ifRoom"
        android:actionViewClass="androidx.appcompat.widget.SearchView" />
</menu>

Jika Anda menginginkan ikon penelusuran yang lebih mudah diakses, buat ic_search.xml dalam folder /res/drawable dan sertakan kode berikut di dalamnya:

<vector
    android:height="24dp"
    android:tint="#000000"
    android:viewportHeight="24"
    android:viewportWidth="24"
    android:width="24dp"
    xmlns:android="http://schemas.android.com/apk/res/android">
        <path android:fillColor="@android:color/white" android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/>
</vector>

Untuk menampilkan SearchView di panel aplikasi, inflate menu XML resource res/menu/options_menu.xml dalam onCreateOptionsMenu() aktivitas Anda:

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    menuInflater.inflate(R.menu.options_menu, menu)

    return true
}

Menjalankan aplikasi akan menghasilkan sesuatu seperti ini:

Gambar yang menampilkan layar kosong dengan ikon penelusuran di panel atas aplikasi
Gambar 1. Ikon penelusuran di panel atas aplikasi.

SearchView muncul di panel aplikasi aplikasi Anda, tetapi tidak fungsional. Jika mengetuk ikon penelusuran, Anda akan mendapatkan tampilan seperti ini:

Gambar yang menunjukkan cara kerja tampilan penelusuran
Gambar 2. Cara kerja SearchView.

Untuk membuat SearchView berfungsi, Anda harus menentukan cara SearchView berperilaku.

Membuat konfigurasi penelusuran

Sebuah penelusuran konfigurasi menentukan bagaimana SearchView berperilaku dan ditentukan dalam file res/xml/searchable.xml. Konfigurasi penelusuran minimal harus berisi atribut android:label yang memiliki nilai yang sama dengan atribut android:label elemen <aplikasi> atau <activity> di manifes Android Anda. Namun, kami juga menyarankan untuk menambahkan Atribut android:hint untuk memberikan gambaran kepada pengguna tentang apa yang harus dimasukkan ke kotak penelusuran.

<?xml version="1.0" encoding="utf-8"?>

<searchable xmlns:android="http://schemas.android.com/apk/res/android"
        android:label="@string/app_name"
        android:hint="@string/search_hint" />

Dalam file manifes aplikasi Anda, deklarasikan sebuah <meta-data> yang mengarah ke file res/xml/searchable.xml. Deklarasikan dalam <activity> tempat Anda ingin menampilkan SearchView.

<activity
android:name=".SearchResultsActivity"
android:exported="false"
android:label="@string/title_activity_search_results"
android:launchMode="singleTop"
android:theme="@style/Theme.AppCompat.Light">
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    <meta-data
        android:name="android.app.searchable"
        android:resource="@xml/searchable" />
</activity>

Dalam metode onCreateOptionsMenu() yang Anda buat, kaitkan konfigurasi penelusuran dengan SearchView dengan memanggil setSearchableInfo(SearchableInfo):

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    menuInflater.inflate(R.menu.options_menu, menu)

    val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
    val searchView = menu.findItem(R.id.search).actionView as SearchView
    val component = ComponentName(this, SearchResultsActivity::class.java)
    val searchableInfo = searchManager.getSearchableInfo(component)
    searchView.setSearchableInfo(searchableInfo)
    return true
}

Panggilan ke getSearchableInfo() memperoleh SearchableInfo yang dibuat dari file XML konfigurasi penelusuran. Saat penelusuran sudah dikaitkan dengan benar ke SearchView dan pengguna mengirimkan kueri, SearchView memulai aktivitas dengan ACTION_SEARCH intent. Anda kemudian memerlukan aktivitas yang bisa memfilter intent ini dan menangani kueri penelusuran.

Membuat aktivitas penelusuran

Filter aktivitas yang dapat ditelusuri untuk intent ACTION_SEARCH dan mencari kueri di suatu {i>dataset.<i} Untuk membuat aktivitas yang dapat ditelusuri, deklarasikan aktivitas pilihan Anda untuk memfilter ACTION_SEARCH intent:

<activity android:name=".SearchResultsActivity" ... >
    ...
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    ...
</activity>

Dalam aktivitas penelusuran Anda, tangani intent ACTION_SEARCH dengan memeriksanya di onCreate() .

Kotlin

class SearchResultsActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_search_results)
        handleIntent(intent)
    }

    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        handleIntent(intent)
    }

    private fun handleIntent(intent: Intent) {
        if (Intent.ACTION_SEARCH == intent.action) {
            val query = intent.getStringExtra(SearchManager.QUERY)
            Log.d("SEARCH", "Search query was: $query")
        }
    }
}

Sekarang, SearchView dapat menerima kueri pengguna dan memulai aktivitas penelusuran dengan intent ACTION_SEARCH.

Setelah mendapatkan kueri penelusuran, Anda dapat meneruskannya ke ViewModel, tempat Anda dapat menggunakannya di lapisan lain arsitektur untuk mengambil hasil penelusuran yang akan ditampilkan.