Tata letak saya berisi ListView
, SurfaceView
dan EditText
. Ketika saya mengkliknya EditText
, itu menerima fokus dan keyboard di layar muncul. Saat saya mengklik di suatu tempat di luar EditText
, itu masih memiliki fokus (seharusnya tidak). Saya kira saya bisa mengatur OnTouchListener
tampilan lain dalam tata letak dan secara manual menghapus EditText
fokus. Tapi sepertinya terlalu hackish ...
Saya juga memiliki situasi yang sama di layout lain - tampilan daftar dengan berbagai jenis item, beberapa di antaranya ada EditText
di dalamnya. Mereka bertindak seperti yang saya tulis di atas.
Tugasnya adalah membuat EditText
kehilangan fokus saat pengguna menyentuh sesuatu di luarnya.
Saya telah melihat pertanyaan serupa di sini, tetapi belum menemukan solusi apa pun ...
sumber
hideSoftInputFromWindow()
lalu hapus fokusBerdasarkan jawaban Ken, inilah solusi salin dan tempel yang paling modular.
Tidak perlu XML.
Letakkan di Aktivitas Anda dan itu akan berlaku untuk semua EditText termasuk yang ada di dalam fragmen di dalam aktivitas itu.
sumber
MotionEvent.ACTION_DOWN
keMotionEvent.ACTION_UP
pada kode Anda. Jawaban yang bagus btw!Untuk tampilan induk EditText, biarkan 3 atribut berikut menjadi " true ":
clickable , focusable , focusableInTouchMode .
Jika tampilan ingin menerima fokus, itu harus memenuhi 3 kondisi ini.
Lihat android.view :
Semoga membantu.
sumber
(clickable) *OR* (focusable *AND* focusableInTouchMode)
;)Letakkan saja properti ini di induk paling atas.
sumber
Jawaban Ken berhasil, tapi itu hacky. Seperti yang disinggung pc dalam komentar jawaban, hal yang sama dapat dilakukan dengan dispatchTouchEvent. Solusi ini lebih bersih karena menghindari keharusan meretas XML dengan FrameLayout tiruan yang transparan. Seperti inilah tampilannya:
sumber
Untuk Saya Di Bawah Hal-hal yang Berhasil -
1. Menambah
android:clickable="true"
danandroid:focusableInTouchMode="true"
keparentLayout
dariEditText
yaituandroid.support.design.widget.TextInputLayout
2. Mengesampingkan
dispatchTouchEvent
di kelas Aktivitas dan menyisipkanhideKeyboard()
fungsi3. Menambahkan
setOnFocusChangeListener
untuk EditTextsumber
Anda mungkin sudah menemukan jawaban untuk masalah ini, tetapi saya telah mencari cara untuk menyelesaikannya dan masih tidak dapat benar-benar menemukan apa yang saya cari, jadi saya pikir saya akan mempostingnya di sini.
Apa yang saya lakukan adalah sebagai berikut (ini sangat umum, tujuannya adalah memberi Anda gambaran tentang bagaimana melanjutkan, menyalin dan menempel semua kode tidak akan berfungsi O: D):
Pertama memiliki EditText dan tampilan lain yang Anda inginkan dalam program Anda dibungkus oleh satu tampilan. Dalam kasus saya, saya menggunakan LinearLayout untuk membungkus semuanya.
Kemudian dalam kode Anda, Anda harus menyetel Touch Listener ke LinearLayout utama Anda.
Saya harap ini membantu beberapa orang. Atau setidaknya membantu mereka mulai memecahkan masalah mereka.
sumber
Cukup tentukan dua properti induknya
EditText
sebagai:Jadi saat pengguna akan menyentuh di luar
EditText
area, fokus akan terhapus karena fokus akan dialihkan ke tampilan induk.sumber
Saya telah a
ListView
terdiri dariEditText
pandangan. Skenario mengatakan bahwa setelah mengedit teks dalam satu baris atau lebih, kita harus mengklik tombol yang disebut "selesai". Saya menggunakanonFocusChanged
padaEditText
tampilan dalamlistView
tapi setelah mengklik finish data tidak disimpan. Masalahnya diselesaikan dengan menambahkandi dalam
onClickListener
untuk tombol "selesai" dan data berhasil disimpan.sumber
Saya benar-benar berpikir ini cara yang lebih kuat untuk digunakan
getLocationOnScreen
daripadagetGlobalVisibleRect
. Karena saya menemui masalah. Ada Listview yang berisi beberapa Edittext dan dan diaturajustpan
dalam aktivitas. Saya menemukangetGlobalVisibleRect
kembali nilai yang terlihat seperti termasuk scrollY di dalamnya, tetapi event.getRawY selalu dekat layar. Kode di bawah ini berfungsi dengan baik.sumber
Untuk kehilangan fokus saat tampilan lain disentuh, kedua tampilan harus disetel sebagai view.focusableInTouchMode (true).
Namun tampaknya penggunaan fokus dalam mode sentuh tidak disarankan. Silakan lihat di sini: http://android-developers.blogspot.com/2008/12/touch-mode.html
sumber
Cara terbaik adalah menggunakan metode default
clearFocus()
Anda tahu cara memecahkan kode dalam
onTouchListener
benar?Telepon saja
EditText.clearFocus()
. Ini akan memperjelas fokuslast EditText
.sumber
Seperti yang disarankan @pcans, Anda dapat melakukan penggantian ini
dispatchTouchEvent(MotionEvent event)
dalam aktivitas Anda.Di sini kita mendapatkan koordinat sentuh dan membandingkannya untuk melihat batas. Jika sentuhan dilakukan di luar pandangan, lakukan sesuatu.
Juga tidak perlu memeriksa keberadaan tampilan dan visibilitas jika tata letak aktivitas Anda tidak berubah selama waktu proses (misalnya, Anda tidak menambahkan fragmen atau mengganti / menghapus tampilan dari tata letak). Tetapi jika Anda ingin menutup (atau melakukan sesuatu yang serupa) menu konteks kustom (seperti di Google Play Store saat menggunakan menu luapan item), perlu untuk memeriksa keberadaan tampilan. Jika tidak, Anda akan mendapatkan file
NullPointerException
.sumber
Potongan kode sederhana ini melakukan apa yang Anda inginkan
sumber
Di Kotlin
hidekeyboard () adalah Ekstensi Kotlin
Dalam aktivitas, tambahkan dispatchTouchEvent
Tambahkan properti ini di paling atas induk
sumber
Ini adalah Versi saya berdasarkan kode zMan. Itu tidak akan menyembunyikan keyboard jika tampilan berikutnya juga merupakan teks edit. Itu juga tidak akan menyembunyikan keyboard jika pengguna hanya menggulir layar.
sumber