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" />
Eli Revah
sumber

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.

Matthias Robbers
sumber
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();
qbait.dll
sumber
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);
Olayinka
sumber
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 :)

James Campbell
sumber
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.

Gunnar Bernstein
sumber
0

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

searchView.findViewById(R.id.search_button).performClick();
Santanu Sur
sumber