Bagaimana cara membuka SearchView secara terprogram?


102

Ada widget untuk ActionBar yang disebut 'SearchView'. Saat tidak digunakan, akan terlihat seperti ini:

masukkan deskripsi gambar di sini

Dan ketika sedang digunakan, akan terlihat seperti ini:

masukkan deskripsi gambar di sini

Saya ingin (tentu saja secara terprogram) membuka tampilan pencarian (membuatnya "digunakan").

Saya mencoba beberapa fungsi seperti:

SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
    searchView.setOnQueryTextListener(this);

    searchView.performClick();
    searchView.requestFocus();

Tapi tidak ada yang berhasil ...

SearchView di XML:

<item android:id="@+id/menu_search"
      android:title="Search"
      android:icon="@drawable/ic_action_search"
      android:showAsAction="ifRoom|collapseActionView"
      android:actionViewClass="android.widget.SearchView" />

Jawaban:


255

Perluas SearchViewdengan

searchView.setIconified(false);

dan tutup dengan

searchView.setIconified(true);

Anda perlu mengubah nilai android:showAsActiondari ifRoom|collapseActionViewmenjadi always. The SearchView's atribut android:iconifiedByDefaultharus true, yang merupakan nilai default, jika pengguna tidak dapat menutup SearchViewsetelah itu diperluas pemrograman.


15
Halo, keyboard muncul tetapi SearchView tidak terbuka.
Eli Revah

1
Halo, ini juga tidak berhasil. Saya memperbarui posting dengan kode sumber XML.
Eli Revah

7
Man, Anda adalah pahlawan f * king saya
Eliseo Ocampos

1
showAsAction = "selalu" akan menampilkan bilah pencarian layar penuh yang jelek, setelah rotasi
Francesco Gabbrielli

1
showAsAction="always"membuat ikon pencarian tetap berada di bilah tindakan saat diperluas, yang tidak menyerupai tampilan saat memfokuskan pencarian secara manual.
Ixx

74

Coba panggil expandActionView()MenuItem, bukan onActionViewExpanded () di ActionView.

Ini bekerja untuk saya.

MenuItem searchMenuItem = menu.findItem(R.id.menu_search);
searchView = (SearchView) searchMenuItem.getActionView();
searchMenuItem.expandActionView();

10
Bekerja sempurna, tetapi hanya untuk API> 14. Untuk API sebelumnya, Anda dapat menggunakan ini: MenuItemCompat.expandActionView (searchMenuItem);
Andrei Aulaska

Ini adalah solusi yang benar - Pilihan yang dipilih memaksa Anda untuk mengatur showAsAction: alwaysyang menyebabkan beberapa masalah.
Ixx

13

Jika Anda ingin menggunakan pustaka dukungan hanya jika diperlukan, lakukan ini

    MenuItem searchMenuItem = menu.findItem(R.id.action_search);
    if (Utils.hasIceCreamSandwich())
        searchMenuItem.expandActionView();
    else MenuItemCompat.expandActionView(searchMenuItem);

lain lakukan saja ini

    MenuItem searchMenuItem = menu.findItem(R.id.action_search);
    MenuItemCompat.expandActionView(searchMenuItem);

6

Saya tahu ini terlambat tapi

Coba panggil expandActionView () untuk membukanya dan collapseActionView () untuk menutupnya. Anda bisa memanggil requestFocus () pada Tampilan Tindakan aktual melalui getActionView () untuk memberikan fokus tampilan pencarian :)


1

Memperluas jawaban Perampokan Matthias:

Saya ingin sebuah fragmen daftar untuk menyimpan nilai pencariannya dan mengaturnya setelah pengguna kembali dari fragmen lain.

if (myViewModel.filterTextSaved.isNotEmpty()) { // Kotlin, storing state in ViewModel
    searchItem.expandActionView() // needs to come first, otherwise empty text
    theTextArea.setText(courseViewModel.filterTextOnClick)
}

dan untuk menu yang saya simpan always|collapseActionView, jika tidak maka tetap terbuka saat pengguna menghapus teks.


0

Untuk membuka sebuah searchViewpenyimpanan close_buttonpada akhirnya gunakan ini di onCreate: -

searchView.findViewById(R.id.search_button).performClick();
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.