Menyiapkan Antarmuka Penelusuran

Mulai Android 3.0, menggunakan widget SearchView sebagai item di panel aplikasi adalah cara pilihan untuk menyediakan penelusuran di aplikasi Anda. Seperti semua item di panel aplikasi, Anda dapat menentukan SearchView untuk ditampilkan setiap saat, hanya saat ada ruangan, atau sebagai tindakan yang dapat diciutkan, yang awalnya menampilkan SearchView sebagai ikon, kemudian menggunakan seluruh panel aplikasi sebagai kolom penelusuran saat pengguna mengklik ikon tersebut.

Catatan: Nantinya di tutorial ini, Anda akan belajar cara membuat aplikasi Anda kompatibel dengan Android 2.1 (API level 7) untuk perangkat yang tidak mendukung SearchView.

Menambahkan SearchView ke Panel Aplikasi

Untuk menambahkan widget SearchView ke panel aplikasi, buat file bernama res/menu/options_menu.xml di project Anda dan tambahkan kode berikut ke file tersebut. Kode ini menentukan cara membuat item penelusuran, seperti ikon yang digunakan dan judul item. Atribut collapseActionView memungkinkan SearchView Anda meluas untuk menggunakan seluruh panel aplikasi dan menciutkan kembali menjadi item panel aplikasi normal jika tidak digunakan. Karena ruang panel aplikasi terbatas di perangkat handset, penggunaan atribut collapsibleActionView direkomendasikan untuk memberi pengalaman pengguna yang lebih baik.

    <?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="android.widget.SearchView" />
    </menu>
    

Catatan: Jika sudah memiliki file XML yang ada untuk item menu, Anda dapat menambahkan elemen <item> ke file tersebut.

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

Kotlin

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

        return true
    }
    

Java

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.options_menu, menu);

        return true;
    }
    

Jika Anda menjalankan aplikasi sekarang, SearchView akan muncul di panel aplikasinya aplikasi Anda, tetapi tidak berfungsi. Sekarang Anda harus menentukan bagaimana SearchView akan berperilaku.

Membuat Konfigurasi yang Dapat Ditelusuri

Konfigurasi yang dapat ditelusuri menentukan cara SearchView berperilaku dan ditentukan dalam file res/xml/searchable.xml. Minimal, konfigurasi yang dapat ditelusuri harus berisi atribut android:label yang memiliki nilai yang sama dengan atribut android:label dari elemen <application> atau <activity> di manifes Android Anda. Namun, sebaiknya Anda juga menambahkan atribut android:hint untuk memberikan gambaran kepada pengguna tentang apa yang harus dimasukkan ke dalam 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 elemen <meta-data> yang mengarah ke file res/xml/searchable.xml, sehingga aplikasi Anda mengetahui tempat untuk menemukannya. Deklarasikan elemen dalam <activity> yang Anda ingin untuk menampilkan SearchView di:

    <activity ... >
        ...
        <meta-data android:name="android.app.searchable"
                android:resource="@xml/searchable" />

    </activity>
    

Dalam metode onCreateOptionsMenu() yang Anda buat sebelumnya, kaitkan konfigurasi yang dapat ditelusuri ke SearchView dengan memanggil setSearchableInfo(SearchableInfo):

Kotlin

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

        // Associate searchable configuration with the SearchView
        val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
        (menu.findItem(R.id.search).actionView as SearchView).apply {
            setSearchableInfo(searchManager.getSearchableInfo(componentName))
        }

        return true
    }
    

Java

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.options_menu, menu);

        // Associate searchable configuration with the SearchView
        SearchManager searchManager =
               (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView =
                (SearchView) menu.findItem(R.id.search).getActionView();
        searchView.setSearchableInfo(
                searchManager.getSearchableInfo(getComponentName()));

        return true;
    }
    

Panggilan ke getSearchableInfo() akan mendapatkan objek SearchableInfo yang dibuat dari file XML konfigurasi yang dapat ditelusuri. Saat konfigurasi yang dapat ditelusuri dikaitkan ke SearchView dengan benar, SearchView akan memulai aktivitas bersama intent ACTION_SEARCH saat pengguna mengirimkan kueri. Anda sekarang memerlukan aktivitas yang dapat memfilter intent ini dan menangani kueri penelusuran.

Membuat Aktivitas yang Dapat Ditelusuri

SearchView mencoba memulai aktivitas dengan ACTION_SEARCH saat pengguna mengirimkan kueri penelusuran. Aktivitas yang dapat ditelusuri akan memfilter intent ACTION_SEARCH dan menelusuri kueri dalam semacam set data. Untuk membuat aktivitas yang dapat ditelusuri, deklarasikan aktivitas pilihan Anda untuk memfilter intent ACTION_SEARCH:

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

Dalam aktivitas Anda yang dapat ditelusuri, tangani intent ACTION_SEARCH dengan mencentangnya di metode onCreate() Anda.

Catatan: Jika aktivitas Anda yang dapat ditelusuri diluncurkan dalam mode single top (android:launchMode="singleTop"), tangani juga intent ACTION_SEARCH dalam metode onNewIntent(). Dalam mode single top, hanya satu instance dari aktivitas Anda yang akan dibuat dan panggilan berikutnya untuk memulai aktivitas Anda tidak akan membuat aktivitas baru pada stack. Mode peluncuran ini bermanfaat sehingga pengguna dapat melakukan penelusuran dari aktivitas yang sama tanpa membuat instance aktivitas baru setiap saat.

Kotlin

    class SearchResultsActivity : Activity() {

        override fun onCreate(savedInstanceState: Bundle?) {
            ...
            handleIntent(intent)
        }

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

        private fun handleIntent(intent: Intent) {

            if (Intent.ACTION_SEARCH == intent.action) {
                val query = intent.getStringExtra(SearchManager.QUERY)
                //use the query to search your data somehow
            }
        }
        ...
    }
    

Java

    public class SearchResultsActivity extends Activity {

        @Override
        public void onCreate(Bundle savedInstanceState) {
            ...
            handleIntent(getIntent());
        }

        @Override
        protected void onNewIntent(Intent intent) {
            ...
            handleIntent(intent);
        }

        private void handleIntent(Intent intent) {

            if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
                String query = intent.getStringExtra(SearchManager.QUERY);
                //use the query to search your data somehow
            }
        }
        ...
    }
    

Jika Anda menjalankan aplikasi sekarang, SearchView dapat menerima kueri pengguna dan memulai aktivitas yang dapat ditelusuri dengan intent ACTION_SEARCH. Anda kini bebas menentukan cara menyimpan dan menelusuri data Anda dengan kueri.