Apakah ada yang tahu tutorial atau contoh tentang bagaimana mengimplementasikan antarmuka pencarian Android standar dengan Fragment
s? Dengan kata lain, apakah mungkin untuk menempatkan pencarian standar dengan SearchManager
dalam Fragmen?
java
android
sqlite
android-fragments
android-searchmanager
Sabuk hitam
sumber
sumber
Jawaban:
Singkatnya, kamu tidak bisa. Ada beberapa alasan mengapa membuat antarmuka pencarian dalam a
Fragment
tidak dimungkinkan.Saat membuat antarmuka yang dapat ditelusuri, Anda harus menentukan "aktivitas yang dapat dicari" default di manifes Android Anda. Seperti yang saya yakin Anda tahu, suatu
Fragment
tidak dapat ada tanpa orangtuaActivity
dan dengan demikian, pemisahan ini tidak mungkin.Jika Anda sudah menemukan # 1, saya berasumsi Anda mengajukan pertanyaan ini dengan harapan bahwa ada beberapa "hack" ajaib di luar sana yang dapat menyelesaikan pekerjaan. Namun, dokumentasi menyatakan bahwa,
Sistem internal yang mendasarinya yang bertanggung jawab untuk menyediakan hasil pencarian mengharapkan
Activity
, bukanFragment
; dengan demikian, mengimplementasikan antarmuka pencarian yang sepenuhnya independen dari suatuActivity
tidak mungkin, karena akan memerlukan perubahan pada sistem yang mendasarinya itu sendiri . Lihat kode sumber untukSearchableInfo
kelas jika Anda tidak percaya saya :).Meski begitu, sepertinya tidak terlalu sulit untuk mencapai sesuatu yang mirip dengan apa yang Anda gambarkan. Misalnya, Anda dapat mempertimbangkan untuk menerapkan Kegiatan yang dapat ditelusuri sehingga akan menerima
android.intent.action.SEARCH
maksud dan (alih-alih segera menampilkan hasil dalamListView
, misalnya) akan meneruskan kueri penelusuran ke milik AndaFragment
. Misalnya, pertimbangkan Aktivitas yang dapat dicari berikut:Ketika permintaan pencarian dibuat, sistem akan meluncurkan aktivitas yang dapat dicari, melakukan kueri, dan akan meneruskan hasilnya ke beberapa aktivitas kontainer (berdasarkan pada implementasi Anda
doMySearch
). Kegiatan wadah kemudian akan meneruskan hasil ini ke pencarian yang terkandungFragment
, di mana hasilnya akan ditampilkan. Implementasinya membutuhkan kerja yang sedikit lebih banyak daripada yang mungkin Anda harapkan, tapi saya yakin ada cara yang dapat Anda lakukan untuk membuatnya lebih modular, dan sepertinya ini mungkin yang terbaik yang dapat Anda lakukan.ps Jika Anda menggunakan pendekatan ini, Anda mungkin harus memberi perhatian khusus pada Kegiatan mana yang ditambahkan / dihapus ke backstack. Lihat posting ini untuk informasi lebih lanjut tentang bagaimana hal ini dapat dilakukan.
pps Anda mungkin juga lupa tentang antarmuka pencarian standar sepenuhnya dan hanya menerapkan pencarian sederhana dalam
Fragment
seperti yang dijelaskan dalam posting Raghav di bawah ini .sumber
SearchManager
untukFragment
benar? (atau semacamnya)Ini adalah contoh untuk mencari sesuatu menggunakan fragmen. Semoga ini bisa membantu dan inilah yang Anda cari:
sumber
Fragment
jadi saya tidak akan mengeluh. Selamat! : PonQueryTextChange
metode kasus saya tidak dipanggil.Sangat mungkin untuk mencari dalam sebuah fragmen menggunakan API ActionViewar ActionView ActionView standar. Ini akan bekerja kembali ke Android 2.1 (API level 7) juga menggunakan kelas dukungan AppCompat v7.
Dalam fragmen Anda:
Dalam XML menu Anda
sumber
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItem.SHOW_AS_ACTION_IF_ROOM); item.setActionView(searchView);
Menggunakan kelas dukungan AppCompat v7. Hanya menambahkan sesuatu untuk @ David solusi 's dari @Rookie solusi untuk mendapatkannya bekerja dengan baik dengan cara yang sederhana, di sini adalah kode fragmen saya:
MyFragment :
Saya menambahkan
onActivityCreated
, cuz tanpa memanggilsetHasOptionsMenu(true);
sistem tidak akan tahu bahwa fragmen ini perlu berinteraksi dengan menu.kemudian saya menghapus baris
inflater.inflate(R.menu.main, menu);
karena menggandakan item menu sejak Activity menggembungkan menu, lalu Fragment menggelembungkan menu lainTerima kasih kepada @David dan @Rookie
sumber
Saat bekerja dengan
Fragments
Anda masih perlu menggunakanActivity
untuk mengontrol dan menetapkanFragments
. IniActivity
dapat memiliki fungsi pencarian seperti sebelumnya.Saya baru-baru ini beralih dari
Activity
aplikasi berbasis 'normal' , keFragment
aplikasi berbasis dan fungsi pencarian bekerja sama untuk saya.Sudahkah Anda mencoba mengerjakannya, dan tidak berhasil? Jika demikian, berikan lebih banyak detail dalam pertanyaan Anda.
EDIT:
Jika Anda ingin memiliki pencarian fragmen tertentu, memiliki semua Anda
Fragments
memperpanjang sebuah antarmukaMyFragment
denganstartSearch
metode, dan memiliki AndaActivity
'sstartSearch
metode panggilan fragmen saat inistartSearch
metode.sumber
Saya rasa saya mencapainya: Anda benar-benar dapat menggunakan fragmen dan menambahkan ikon pencarian ke panel tindakan sehingga pencarian dimungkinkan di dalam fragmen. Caranya adalah dengan menggunakan panel tindakan, tampilan tindakan, pendengar untuk itu, loader dan adaptor tentunya.
Ini bekerja cukup baik meskipun sepenuhnya mem-bypass mekanisme pencarian platform android (tetapi bisa diselesaikan dengan beberapa pekerjaan untuk menemukan apa yang dijelaskan oleh @Alex Lockwood dan meneruskan pencarian ke fragmen). Itu tidak akan bereaksi terhadap maksud seperti yang diharapkan dalam kasus suatu kegiatan, tetapi berfungsi: pengguna dapat mencari di dalam fragmen.
Ini kodenya:
File xml untuk menu res fragmen pencarian / menu / menu_search.xml:
Dan file tata letak xml res / tata letak / search_in_fragments.xml
sumber
SearchView
perpustakaan ActionBarSherlock karena kerumitannya ( lihat komentarnya di sini ). Seperti yang Anda lihat (dan seperti yang saya jelaskan dalam jawaban saya juga), implementasi pencarian Android sama sekali tidak penting ... itu sudah tertanam dalam sistem yang mendasarinya, dan ini membuat bahkan perpustakaan pihak ke-3 sulit untuk menulis (dan itu mengatakan sesuatu. .. Jake Wharton seperti Chuck Norris dari perpustakaan pihak ke-3!: D).SearchView.java
kode sumber di sini.Gunakan
ActionBar
danSearchView
. Anda akan dapat menangani pencarian tanpa koneksi ke Activity. Cukup atur sebuahOnQueryTextListener
ke SearchView.Lihat posting ini untuk detail lebih lanjut tentang pencarian kustom.
sumber
solusi lain ..... saya tidak suka itu. Ini lebih mudah bagi saya. Tapi itu ide saya. Saya menunggu pendapat Anda
sumber
A
Fragment
tidak dapat eksis di luarActivity
, juga tidak dapatFragment
dikaitkan denganandroid.intent.action.SEARCH
atau yang lainintent-filter
.Jadi tanpa menggunakan
Activity
untuk membungkusFragment
, apa yang Anda minta tidak mungkin.sumber
Dalam hal Fragmen menjadi ViewPager, saya bisa melakukannya dengan memblokir tombol pencarian ketika saya tidak berada di fragmen tempat saya ingin memberikan bilah pencarian. Ke dalam kegiatan:
Dan jika tidak ada tombol pencarian fisik, saya menambahkan item tindakan ke dalam fragmen, yang memicu kode ini:
sumber
saya menemukan pekerjaan sekitar :) Anda dapat mengganti metode ini (startActivity (Intent)) di BaseActivity Anda dan kemudian memeriksa apakah tindakannya ACTION_SEARCH kemudian lakukan pekerjaan khusus Anda: D
sumber
iya itu mungkin,
tolong terapkan tampilan Pencarian pada Aktivitas Anda, 'onQueryTextChange' di Activity juga akan mendengarkan pencarian dalam fragmen, Anda dapat memeriksa visibilitas fragmen di 'onQueryTextChange', jika terlihat Anda dapat memanggil metode pencarian untuk fragmen, itu berfungsi sempurna dalam kode saya
sumber