Ok semua orang tahu bahwa untuk menyembunyikan keyboard Anda perlu menerapkan:
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
Tetapi yang penting di sini adalah bagaimana menyembunyikan keyboard ketika pengguna menyentuh atau memilih tempat lain yang bukan EditText
atau softKeyboard?
Saya mencoba menggunakan onTouchEvent()
pada orang tua saya Activity
tetapi hanya berfungsi jika pengguna menyentuh di luar tampilan lain dan tidak ada scrollview.
Saya mencoba menerapkan sentuhan, klik, pendengar fokus tanpa hasil.
Saya bahkan mencoba menerapkan scrollview saya sendiri untuk mencegat acara sentuh tetapi saya hanya bisa mendapatkan koordinat acara dan bukan tampilan yang diklik.
Apakah ada cara standar untuk melakukan ini ?? di iPhone itu sangat mudah.
android
android-softkeyboard
htafoya
sumber
sumber
getFields()
sini: stackoverflow.com/questions/7790487/…Jawaban:
Cuplikan berikut hanya menyembunyikan keyboard:
Anda dapat menempatkan ini di kelas utilitas, atau jika Anda mendefinisikannya dalam suatu kegiatan, hindari parameter aktivitas, atau panggilan
hideSoftKeyboard(this)
.Bagian tersulit adalah kapan menyebutnya. Anda dapat menulis metode yang berulang-ulang
View
di setiap aktivitas Anda, dan memeriksa apakah itu adalahinstanceof EditText
jika tidak mendaftarsetOnTouchListener
ke komponen itu dan semuanya akan jatuh pada tempatnya. Jika Anda bertanya-tanya bagaimana cara melakukannya, itu sebenarnya cukup sederhana. Inilah yang Anda lakukan, Anda menulis metode rekursif seperti berikut ini, sebenarnya Anda dapat menggunakan ini untuk melakukan apa saja, seperti mengatur tipografi kustom dll ... Ini adalah metodeItu saja, panggil metode ini setelah Anda
setContentView
beraktivitas. Jika Anda bertanya-tanya parameter apa yang akan Anda lewati, itu adalahid
wadah induk. Tetapkan sebuahid
ke wadah induk Anda seperti<RelativeLayoutPanel android:id="@+id/parent"> ... </RelativeLayout>
dan telepon
setupUI(findViewById(R.id.parent))
, itu saja.Jika Anda ingin menggunakan ini secara efektif, Anda dapat membuat extended
Activity
dan memasukkan metode ini, dan membuat semua aktivitas lain dalam aplikasi Anda memperpanjang aktivitas ini dan memanggilnyasetupUI()
dalamonCreate()
metode.Semoga ini bisa membantu.
Jika Anda menggunakan lebih dari 1 aktivitas, tentukan id umum untuk tata letak induk seperti
<RelativeLayout android:id="@+id/main_parent"> ... </RelativeLayout>
Kemudian rentangkan kelas dari
Activity
dan definisikansetupUI(findViewById(R.id.main_parent))
Di dalamnyaOnResume()
dan perluas kelas ini sebagai ganti dari `` Activityin your program
Ini adalah versi Kotlin dari fungsi di atas:
sumber
if(activity.getCurrentFocus() != null) {...}
OnTouchListener
untuk mereka. Anda bisa mengatur logika ituViewGroup.onInterceptTouchEvent(MotionEvent)
ke tampilan root.Anda dapat mencapai ini dengan melakukan langkah-langkah berikut:
Jadikan tampilan induk (tampilan konten aktivitas Anda) dapat diklik dan fokus dengan menambahkan atribut berikut
Terapkan metode hideKeyboard ()
Terakhir, atur onFocusChangeListener dari edittext Anda.
Seperti yang ditunjukkan dalam salah satu komentar di bawah, ini mungkin tidak berfungsi jika tampilan induknya adalah ScrollView. Untuk kasus seperti itu, InTouchMode yang dapat diklik dan dapat ditambahkan pada tampilan langsung di bawah ScrollView.
sumber
clickable
danfocusableInTouchMode
keScrollView
elemen root saya . Saya harus menambahkan ke orang tua langsung sayaEditText
yang merupakanLinearLayout
.Cukup timpa kode di bawah ini dalam Activity
sumber
Saya menemukan jawaban yang diterima agak rumit.
Inilah solusi saya. Tambahkan
OnTouchListener
ke tata letak utama Anda, yaitu .:dan letakkan kode berikut dalam metode onTouch.
Dengan cara ini Anda tidak perlu mengulang semua pandangan.
sumber
android:onClick="stealFocusFromEditTexts"
ke xml tampilan induk dan kemudianpublic void stealFocusFromEditTexts(View view) {}
ke aktivitasnya. Metode on-klik tidak perlu melakukan apa-apa, itu hanya harus ada agar tampilan induk menjadi fokus / dapat dipilih, yang diperlukan untuk mencuri fokus dari anak. EditTextSaya punya satu solusi lagi untuk menyembunyikan keyboard dengan:
Di sini lewat
HIDE_IMPLICIT_ONLY
di posisishowFlag
dan0
di posisihiddenFlag
. Ini akan menutup keyboard lunak dengan paksa.sumber
Yah saya berhasil menyelesaikan masalah, saya membatalkan dispatchTouchEvent pada aktivitas saya, di sana saya menggunakan yang berikut untuk menyembunyikan keyboard.
EDIT: Metode getFields () hanyalah metode yang mengembalikan array dengan bidang teks dalam tampilan. Untuk menghindari membuat array ini di setiap sentuhan, saya membuat array statis bernama sFields, yang dikembalikan pada metode getFields (). Array ini diinisialisasi pada metode onStart () seperti:
sFields = new EditText[] {mUserField, mPasswordField};
Itu tidak sempurna, waktu acara drag hanya didasarkan pada heuristik jadi kadang-kadang tidak menyembunyikan ketika melakukan clics panjang, dan saya juga selesai dengan membuat metode untuk mendapatkan semua editTexts per tampilan; selain itu keyboard akan bersembunyi dan ditampilkan ketika mengklik EditText lainnya.
Tetap saja, solusi yang lebih bersih dan lebih pendek dipersilakan
sumber
getFields()
metode Anda ? Itu tidak harus tepat, hanya sebuah contoh dengan mungkin hanya beberapa komentar yang menunjukkan bahwa ia mengembalikan arrayEditText
objek.Gunakan OnFocusChangeListener .
Sebagai contoh:
Pembaruan : Anda juga dapat mengganti
onTouchEvent()
aktivitas Anda dan memeriksa koordinat sentuhan. Jika koordinat berada di luar EditText, sembunyikan keyboard.sumber
Saya menerapkan dispatchTouchEvent di Aktivitas untuk melakukan ini:
dan saya mengujinya, berfungsi sempurna!
sumber
Cara Desain Kotlin & Material lainnya menggunakan TextInputEditText (pendekatan ini juga kompatibel dengan EditTextView ) ...
1.Membuat tampilan induk (tampilan konten aktivitas / fragmen Anda) dapat diklik dan fokus dengan menambahkan atribut berikut
2.Buat ekstensi untuk semua Tampilan (di dalam file ViewExtension.kt misalnya):
3.Buat BaseTextInputEditText yang mewarisi TextInputEditText. Menerapkan metode onFocusChanged untuk menyembunyikan keyboard ketika tampilan tidak fokus:
4. panggil saja tampilan kustom baru Anda di XML Anda:
Itu saja. Tidak perlu memodifikasi pengontrol Anda (fragmen atau aktivitas) untuk menangani kasus berulang ini.
sumber
Mengesampingkan boolean dispatchTouchEvent publik (acara MotionEvent) di Aktivitas apa pun (atau memperluas kelas Kegiatan)
Dan itu semua yang perlu Anda lakukan
sumber
Saya memodifikasi solusi Andre Luis IM. Saya mencapai yang ini:
Saya membuat metode utilitas untuk menyembunyikan keyboard lunak dengan cara yang sama seperti yang dilakukan Andre Luiz IM:
Tetapi alih-alih mendaftarkan OnTouchListener untuk setiap tampilan, yang memberikan kinerja buruk, saya mendaftarkan OnTouchListener hanya untuk tampilan root. Karena gelembung acara hingga dikonsumsi (EditText adalah salah satu tampilan yang mengkonsumsinya secara default), jika tiba ke tampilan root, itu karena tidak dikonsumsi, jadi saya menutup keyboard lunak.
sumber
Saya sadar bahwa utas ini cukup lama, jawaban yang benar tampaknya valid dan ada banyak solusi yang berfungsi di luar sana, tetapi saya pikir pendekatan yang disebutkan di bawah ini mungkin memiliki manfaat tambahan mengenai efisiensi dan keanggunan.
Saya memerlukan perilaku ini untuk semua kegiatan saya, jadi saya membuat kelas CustomActivity yang diwarisi dari Kegiatan kelas dan "mengaitkan" fungsi dispatchTouchEvent . Ada dua kondisi utama yang harus diperhatikan:
Ini hasil saya:
Catatan: Selain itu, saya menetapkan atribut ini ke tampilan root sehingga memungkinkan untuk menghapus fokus pada setiap bidang input dan mencegah bidang input mendapatkan fokus pada aktivitas awal (membuat konten melihat "catcher catcher"):
sumber
Saya menyukai pendekatan panggilan yang
dispatchTouchEvent
dilakukan oleh htafoya, tetapi:Jadi, saya membuat solusi yang agak lebih mudah ini:
Ada satu kelemahan:
Beralih dari satu
EditText
ke yang lainEditText
membuat keyboard bersembunyi dan melakukan pemasangan ulang - dalam kasus saya itu diinginkan seperti itu, karena itu menunjukkan bahwa Anda beralih di antara dua komponen input.sumber
Plea: Saya tahu saya tidak punya pengaruh, tapi tolong jawab jawaban saya dengan serius.
Masalah: Singkirkan keyboard lunak saat mengklik menjauh dari keyboard atau edit teks dengan kode minimal.
Solusi: Perpustakaan eksternal yang dikenal sebagai Butterknife.
Solusi Satu Jalur:
Solusi Lebih Mudah Dibaca:
Penjelasan: Bind OnClick Listener ke ID induk XML Layout aktivitas, sehingga setiap klik pada tata letak (bukan pada teks edit atau keyboard) akan menjalankan cuplikan kode yang akan menyembunyikan keyboard.
Contoh: Jika file tata letak Anda adalah R.layout.my_layout dan id tata letak Anda adalah R.id.my_layout_id, maka panggilan mengikat Butterknife Anda akan terlihat seperti:
Tautan Dokumentasi Butterknife: http://jakewharton.github.io/butterknife/
Pasang: Butterknife akan merevolusi pengembangan android Anda. Pikirkan itu.
Catatan: Hasil yang sama dapat dicapai tanpa menggunakan perpustakaan eksternal Butterknife. Cukup atur OnClickListener ke tata letak induk seperti dijelaskan di atas.
sumber
Di kotlin, kita bisa melakukan hal berikut. Tidak perlu mengulang semua tampilan. Ini akan bekerja untuk fragmen juga.
sumber
Berikut variasi lain pada jawaban fje yang membahas masalah yang diangkat oleh sosite.
Idenya di sini adalah untuk menangani tindakan turun dan naik dalam metode Kegiatan
dispatchTouchEvent
. Pada tindakan turun, kami mencatat tampilan yang saat ini difokuskan (jika ada) dan apakah sentuhan ada di dalamnya, menyimpan kedua bit informasi tersebut untuk nanti.Pada tindakan selanjutnya, pertama-tama kami kirim, untuk memungkinkan tampilan lain berpotensi mengambil fokus. Jika setelah itu, tampilan yang saat ini fokus adalah tampilan yang awalnya fokus, dan sentuhan bawah ada di dalam tampilan itu, maka kami membiarkan keyboard terbuka.
Jika tampilan yang saat ini fokus berbeda dari tampilan yang semula fokus dan ini adalah
EditText
, maka kami juga membiarkan keyboard terbuka.Kalau tidak kita tutup saja.
Jadi, singkatnya, ini berfungsi sebagai berikut:
EditText
, keyboard tetap terbukaEditText
ke yang lainEditText
, keyboard tetap terbuka (tidak menutup / membuka kembali)EditText
yang saat ini bukan yang lainEditText
, keyboard ditutupEditText
untuk memunculkan bilah tindakan kontekstual (dengan tombol cut / copy / paste), keyboard tetap terbuka, meskipun tindakan UP terjadi di luar fokusEditText
(yang bergerak ke bawah untuk memberikan ruang bagi CAB) . Namun, perlu diketahui bahwa ketika Anda mengetuk tombol di CAB, itu akan menutup keyboard. Itu mungkin atau mungkin tidak diinginkan; jika Anda ingin memotong / menyalin dari satu bidang dan menempel ke yang lain, itu akan menjadi. Jika Anda ingin menempel kembali ke yang samaEditText
, itu tidak akan terjadi.ketika fokus
EditText
berada di bagian bawah layar dan Anda mengklik lama pada beberapa teks untuk memilihnya,EditText
fokus tetap dan karena itu keyboard terbuka seperti yang Anda inginkan, karena kami melakukan "sentuhan dalam batas tampilan" centang pada tindakan turun , bukan tindakan atas.sumber
terlalu sederhana, cukup buat layout baru-baru ini Anda dapat diklik oleh kode ini:
dan kemudian menulis metode dan OnClickListner untuk tata letak itu, sehingga ketika tata letak paling atas disentuh di mana pun itu akan memanggil metode di mana Anda akan menulis kode untuk menghilangkan keyboard. berikut ini adalah kode untuk keduanya; // Anda harus menulis ini di OnCreate ()
metode yang dipanggil dari listner: -
sumber
Saya menemukan sedikit jawaban yang diterima kompleks untuk persyaratan sederhana ini. Inilah yang bekerja untuk saya tanpa ada kesalahan.
sumber
NestedScrollView
atau tata letak yang rumit, lihat jawaban yang diterima: stackoverflow.com/a/11656129/2914140 . Anda harus tahu bahwa wadah lain mungkin mengkonsumsi sentuhan.Ada pendekatan yang lebih sederhana, berdasarkan masalah yang sama iPhone. Cukup timpa tata letak latar belakang pada acara sentuh, tempat teks edit dimuat. Cukup gunakan kode ini di OnCreate aktivitas (login_fondo adalah tata letak root):
sumber
Metode untuk menampilkan / menyembunyikan keyboard lunak
Saya harap mereka bermanfaat
sumber
Yang ini adalah solusi termudah bagi saya (dan berhasil oleh saya).
Ini adalah metode untuk menyembunyikan keyboard.
sekarang atur atribut klik tata letak induk dari aktivitas ke metode di atas
hideKeyboard
baik dari tampilan Desain file XML Anda atau menulis kode di bawah ini dalam tampilan Teks file XML Anda.sumber
Saya telah memperbaiki metode ini, memasukkan kode berikut di beberapa kelas utilitas UI (lebih disukai, tidak harus) sehingga dapat diakses dari semua kelas Aktivitas atau Fragmen Anda untuk memenuhi tujuannya.
Kemudian katakan misalnya Anda perlu memanggilnya dari aktivitas, panggil sebagai berikut;
Memperhatikan
Ini memberi kami tampilan root dari grup saat ini (Anda tidak harus mengatur id pada tampilan root).
Bersulang :)
sumber
Cobalah untuk memakai stateHidden sebagai
windowSoftInputMode
nilai aktivitas Andahttp://developer.android.com/reference/android/R.attr.html#windowSoftInputMode
Misalnya untuk Aktivitas Anda:
sumber
Aktivitas
ScreenUtils
sumber
Tambahkan kode ini di kelas @Overide
sumber
Alih-alih mengulangi semua tampilan atau mengabaikan dispatchTouchEvent.
Mengapa Tidak hanya mengesampingkan onUserInteraction () dari Kegiatan ini akan memastikan keyboard ditolak setiap kali pengguna mengetuk di luar EditText.
Akan berfungsi bahkan ketika EditText ada di dalam scrollView.
sumber
Saya mendapatkan ini dengan sedikit variasi pada solusi Fernando Camarago. Dalam metode onCreate saya, saya melampirkan onTouchListener tunggal ke tampilan root tetapi mengirim tampilan daripada aktivitas sebagai argumen.
Dalam kelas Utils terpisah adalah ...
sumber
Ini mungkin sudah tua tapi saya dapat ini berhasil dengan menerapkan kelas khusus
praktik terbaik di sini adalah membuat kelas Helper dan setiap kontainer Layout Relatif / Linear harus menerapkan ini.
**** Perhatikan bahwa hanya Wadah utama yang harus mengimplementasikan kelas ini (Untuk optimasi) ****
dan implementasikan seperti ini:
kata kunci ini untuk Aktivitas. jadi jika Anda berada di fragmen yang Anda gunakan seperti getActivity ();
--- jempol jika itu membantu Anda ... --- bersorak Ralph ---
sumber
Ini adalah versi jawaban fje yang sedikit dimodifikasi yang sebagian besar bekerja dengan sempurna.
Versi ini menggunakan ACTION_DOWN sehingga melakukan tindakan gulir juga menutup keyboard. Itu juga tidak menyebarkan acara kecuali Anda mengklik EditText lain. Ini berarti bahwa mengklik di mana saja di luar EditText Anda, bahkan pada klik lainnya, cukup tutup keyboard.
sumber
view
danviewTmp
untukgetCurrentFocus()
, sehingga mereka akan selalu memiliki nilai yang sama.Saya telah melakukan ini:
Sembunyikan kode keyboard :
Selesai
sumber