Saya mencoba menambahkan dukungan untuk SearchView
di Android 3.0+ ActionBar, tetapi saya tidak bisa mulai OnCloseListener
bekerja.
Ini kode saya:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
searchView = (SearchView) menu.findItem(R.id.search_textbox).getActionView();
searchView.setOnQueryTextListener(new OnQueryTextListener() {
@Override
public boolean onQueryTextChange(String newText) {
searchLibrary(newText);
return false;
}
@Override
public boolean onQueryTextSubmit(String query) { return false; }
});
searchView.setOnCloseListener(new OnCloseListener() {
@Override
public boolean onClose() {
System.out.println("Testing. 1, 2, 3...");
return false;
}
});
return true;
}
Pencarian berfungsi dengan baik dan semuanya berfungsi kecuali untuk OnCloseListener
. Tidak ada yang dicetak ke Logcat. Ini Logcat untuk saat saya menekan tombol "Tutup":
02-17 13:01:52.914: I/TextType(446): TextType = 0x0
02-17 13:01:57.344: I/TextType(446): TextType = 0x0
02-17 13:02:02.944: I/TextType(446): TextType = 0x0
Saya telah memeriksa dokumentasi dan sampel, tetapi sepertinya tidak ada yang mengubahnya. Saya menjalankannya di Asus Transformer Prime dan Galaxy Nexus, keduanya di Ice Cream Sandwich. Ada ide?
Memperbarui:
Ya - System.out.println()
tidak bekerja. Berikut buktinya:
@Override
public boolean onQueryTextChange(String newText) {
System.out.println(newText + "hello");
searchLibrary(newText);
return false;
}
Hasil di Logcat ini:
02-17 13:04:20.094: I/System.out(21152): hello
02-17 13:04:24.914: I/System.out(21152): thello
02-17 13:04:25.394: I/System.out(21152): tehello
02-17 13:04:25.784: I/System.out(21152): teshello
02-17 13:04:26.064: I/System.out(21152): testhello
showAsAction
diatur kealways
. Kotak pencarian memiliki dekat tombol sendiri tetapi jika sudah diatur untukifRoom | collapseActionView
memperluas pada bar tindakan.Jawaban:
Saya juga menemui masalah ini, dan saya tidak punya pilihan selain menyerah "oncloselistener". Sebagai gantinya, Anda bisa mendapatkan menuItem Anda, lalu
setOnActionExpandListener
. Kemudian timpa metode yang tidak disederhanakan.sumber
if (Build.VERSION.SdkInt > BuildVersionCodes.NMr1) item.SetOnActionExpandListener(this); else MenuItemCompat.SetOnActionExpandListener(item, this);
Untuk Android API 14+ (ICS dan lebih tinggi) gunakan kode ini:
Untuk informasi lebih lanjut: http://developer.android.com/guide/topics/ui/actionbar.html#ActionView
Ref: onActionCollapse / onActionExpand
sumber
Untuk masalah ini saya menemukan sesuatu seperti ini,
sumber
Saya mengalami masalah yang sama di Android 4.1.1. Sepertinya ini adalah bug yang diketahui: https://code.google.com/p/android/issues/detail?id=25758
Bagaimanapun, sebagai solusinya saya menggunakan pendengar perubahan status (ketika SearchView dilepaskan dari bilah tindakan, itu juga ditutup dengan jelas).
Kode di atas bekerja dengan baik dalam kasus saya.
Saya memposting jawaban yang sama di sini: https://stackoverflow.com/a/24573266/2162924
sumber
Saya akhirnya menggunakan sedikit retasan, yang berfungsi dengan baik untuk tujuan saya - tidak yakin itu akan berfungsi dengan semua tujuan. Bagaimanapun, saya sedang melakukan pemeriksaan untuk melihat apakah kueri penelusuran kosong. Ini tidak benar-benar terkait dengan
SearchView
ituOnCloseListener
- itu masih tidak berhasil!sumber
Nah, ini memecahkan masalah saya:
Item menu dengan
showAsAction="always"
dan dalam aktivitas
sumber
always
nilai keshowAsAction
atribut memecahkan masalah. Yang penting adalah ketikaalways
nilaiis not
ada dishowAsAction
, diperluasSearchView
menampilkan tombol tutup (ikon silang) hanya jika kueri dalamSearchView
adalah String non-null. YangSearchView.onCloseClicked
menangani peristiwa tombol tutup memberi tahu bahwa callback keOnCloseListener
dipanggil hanya jika kueri kosong, jika tidak - dihapus terlebih dahulu - tetapi kemudian, setelah menghapus kueri, tombol tutup menghilang dan kami tidak dapat mengirimkanonClose
panggilan balik keOnCloseListener
Untuk membuat
OnCloseListener
pekerjaan, pastikan itushowAsAction
diatur kealways
dalam item menu pencarian.sumber
Saya mengalami masalah yang sama dengan onCloseListener yang tidak mengaktifkan SearchView. Pahami dari masalah bug yang diangkat pada 25758 , dan beberapa postingan yang telah saya baca, untuk menjalankan onCloseListener, Anda perlu menyetel:
Tetapi untuk kasus saya, saya ingin tampilan pencarian dibuka & tidak diikonkan sepanjang waktu. Saya berhasil menyelesaikan ini dengan menambahkan satu baris lagi di bawah ini:
SearchView.setIconified (false) akan menyebabkan searchView terbuka, meskipun menyetel default ke iconified menjadi true di baris sebelumnya. Dengan cara ini, saya berhasil memiliki SearchView yang terbuka sepanjang waktu & membuatnya memanggil onCloseListener.
sumber
Buat item menu dengan
app:showAsAction
set ke selalu.Saat membuat
SearchView
dalamonCreateOptionsMenu
metode, lakukan sesuatu yang serupaThe
search.setIconifiedByDefault(true)
harus ditetapkan untuktrue
untuk memanggilonClose()
metode padaSearchView.OnCloseListener()
buat di atas.sumber
Untuk
MenuItemCompat
masalah, saya menambahkan ViewTreeObserver untuk melacak status visibilitas. Anda dapat memeriksa jawaban saya di sini: https://stackoverflow.com/a/28762632/1633609sumber
Alasan
OnCloseListener
tidak dipanggil adalah karena ada bug di kode Android - pendengar hanya dipanggil jika Anda juga meneleponsetIconifiedByDefault(true)
.sumber
Sepertinya utas lama sudah, tapi saya pikir saya mendapat masalah API 18 yang sama di awal pertama. Setelah mencari-cari di Google, menemukan utas ini, satu jam lagi membaca javadoc mencoba dan salah untuk sesuatu yang saya tidak pura-pura mengerti sepenuhnya di javadoc, berikut pekerjaan untuk saya sekarang:
Saya bermain dengan benar / salah sedikit, yang entah bagaimana membuat perbedaan, dan itu berhasil untuk saya sekarang. Semoga bisa menghemat waktu seseorang.
sumber
Ini adalah solusi tetapi berhasil untuk saya
sumber
jika Anda mengklik close searchView ->
D / klik: tutup diklik
sumber
Saya mengalami masalah ini saat mencoba mendeteksi tampilan / penutupan SearchView. Saya akhirnya menggunakan pendengar yang berbeda dan itu berfungsi untuk apa yang saya butuhkan:
sumber
Saya menggunakan tombol tutup SearchView dan menyetel setOnClickListener di atasnya
sumber
Tidak ada konsol di Android untuk masuk. Sebagai gantinya, gunakan framework logging android:
Lihat juga pertanyaan ini: Mengapa "System.out.println" tidak berfungsi di Android?
sumber
Ada dua pola umum untuk
SearchView.setOnCloseListener()
. Ini benar-benar berlaku untuk semua pendengar, tetapi saya menjawab pertanyaan Anda secara khusus. Cara pertama adalah membuat fungsi pendengar dan melampirkannya ke variabel anggota, dan yang kedua adalah membuat kelas mengimplementasikan antarmuka dan membuat penangan menjadi fungsi anggota.Membuat objek pendengar terlihat seperti ini:
Menerapkan listener di tingkat kelas terlihat seperti ini:
Saya belum melihat contoh yang menciptakan
OnCloseListener
ad-hoc, seperti yang Anda lakukan dalam pertanyaan Anda.sumber