Saya ingin melihat acara ketika pengguna selesai mengedit EditText.
Bagaimana caranya?
android
android-edittext
eddyuk
sumber
sumber
override fun afterTextChanged(s: Editable?) { if (s.toString().length == 5) { val enteredString = s.toString() }
Jawaban:
Setelah pengguna selesai mengedit, dia akan menekan
Done
atauEnter
sumber
Cara yang lebih baik, Anda juga dapat menggunakan pendengar EditText onFocusChange untuk memeriksa apakah pengguna telah melakukan pengeditan: (Tidak perlu bergantung pada pengguna yang menekan tombol Selesai atau Enter pada Soft keyboard)
Catatan: Untuk lebih dari satu EditText, Anda juga dapat membiarkan kelas Anda mengimplementasikan
View.OnFocusChangeListener
lalu menyetel listener untuk Anda masing-masing EditText dan memvalidasinya seperti di bawah inisumber
EditText
. Itu tidak akan pernah kehilangan fokus.EditText
? Apakah saya harus menggunakanonEditorAction
?EditText
, Anda memvalidasi apa pun yang dilakukan pengguna untuk meninggalkan layar.W/ViewRootImpl: Cancelling event due to no window focus: MotionEvent { action=ACTION_CANCEL, actionButton=0, id[0]=0, x[0]=605.52246, y[0]=969.4336, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=238238, downTime=235422, deviceId=0, source=0x1002 }
Meskipun saya mengetik sesuatu. Ini adalah teks edit yang hanya menerima angka.Saya pribadi lebih suka pengiriman otomatis setelah pengetikan berakhir. Inilah cara Anda mendeteksi peristiwa ini.
Deklarasi dan inisialisasi:
Pendengar di misalnya onCreate ()
Jadi, ketika teks diubah, pengatur waktu mulai menunggu perubahan berikutnya terjadi. Ketika terjadi, pengatur waktu dibatalkan dan kemudian dimulai sekali lagi.
sumber
Handler
sajaAnda dapat melakukannya menggunakan setOnKeyListener atau menggunakan textWatcher seperti:
Atur pengamat teks
editText.addTextChangedListener(textWatcher);
lalu panggil
sumber
Meskipun banyak jawaban memang menunjuk ke arah yang benar, saya pikir tidak ada dari mereka yang menjawab apa yang dipikirkan oleh penulis pertanyaan itu. Atau setidaknya saya memahami pertanyaan itu secara berbeda karena saya sedang mencari jawaban untuk masalah serupa. Masalahnya adalah "Bagaimana mengetahui kapan pengguna berhenti mengetik tanpa dia menekan tombol" dan memicu beberapa tindakan (misalnya pelengkapan otomatis). Jika Anda ingin melakukan ini, mulailah Timer di onTextChanged dengan penundaan yang Anda anggap pengguna berhenti mengetik (misalnya 500-700ms), untuk setiap huruf baru saat Anda memulai timer, batalkan yang sebelumnya (atau setidaknya gunakan semacam tandai bahwa ketika mereka mencentang mereka tidak melakukan apa-apa). Berikut kode yang mirip dengan yang saya gunakan:
Perhatikan bahwa saya memodifikasi menjalankan bendera boolean di dalam tugas async saya (Tugas mendapatkan json dari server untuk pelengkapan otomatis).
Juga perlu diingat bahwa ini menciptakan banyak tugas pengatur waktu (saya pikir mereka dijadwalkan pada Thread yang sama tetapi Anda harus memeriksanya), jadi mungkin ada banyak tempat untuk diperbaiki tetapi pendekatan ini juga berfungsi dan intinya adalah Anda harus gunakan Pewaktu karena tidak ada "Pengguna berhenti mengetik acara"
sumber
@Reno dan @Vinayak B menjawab bersama jika Anda ingin menyembunyikan keyboard setelah tindakan
sumber
Pendekatan yang berbeda ... berikut ini contohnya: Jika pengguna mengalami penundaan 600-1000ms saat mengetik, Anda mungkin menganggap dia berhenti.
sumber
Oke, ini pasti berhasil 100%.
Pertama, Anda perlu menyiapkan pendengar jika keyboard ditampilkan atau disembunyikan. Jika keyboard ditampilkan maka kemungkinan pengguna sedang mengetik, jika tidak selesai mengetik.
sumber
heightDiff > 100
barangnya menakutkan imho.Saya memecahkan masalah ini dengan cara ini. Saya menggunakan kotlin.
sumber
Saya memiliki masalah yang sama dan tidak ingin bergantung pada pengguna yang menekan Selesai atau Enter.
Upaya pertama saya adalah menggunakan pendengar onFocusChange, tetapi ternyata EditText saya mendapatkan fokus secara default. Saat pengguna menekan beberapa tampilan lain, onFocusChange dipicu tanpa pengguna pernah menetapkannya sebagai fokus.
Solusi berikutnya melakukannya untuk saya, di mana onFocusChange dilampirkan jika pengguna menyentuh EditText:
Dalam kasus saya, ketika pengguna selesai mengedit layar dirender, dengan demikian memperbarui objek myEditText. Jika objek yang sama disimpan, Anda mungkin harus menghapus listener onFocusChange di onFocusChange untuk mencegah masalah onFocusChange yang dijelaskan di awal posting ini.
sumber
Saya mengalami masalah yang sama saat mencoba menerapkan 'sekarang mengetik' di aplikasi obrolan. coba untuk memperluas EditText sebagai berikut:
}
sumber
Saya mengakhirinya dengan masalah yang sama dan saya tidak dapat menggunakan solusi dengan onEditorAction atau onFocusChange dan tidak ingin mencoba pengatur waktu. Timer terlalu berbahaya untuk rasa, karena semua utas dan terlalu tidak terduga, karena Anda tidak tahu kapan kode Anda dijalankan.
OnEditorAction tidak menangkap saat pengguna pergi tanpa menggunakan tombol dan jika Anda menggunakannya harap perhatikan bahwa KeyEvent bisa menjadi null. Fokus tidak dapat diandalkan di kedua ujungnya, pengguna bisa mendapatkan fokus dan keluar tanpa memasukkan teks apa pun atau memilih bidang dan pengguna tidak perlu meninggalkan bidang EditText terakhir.
Solusi saya menggunakan onFocusChange dan sebuah flag disetel ketika pengguna mulai mengedit teks dan sebuah fungsi untuk mendapatkan teks dari tampilan fokus terakhir, yang saya panggil saat dibutuhkan.
Saya hanya menghapus fokus pada semua bidang teks saya untuk mengelabui kode tampilan teks cuti, Kode clearFocus hanya dijalankan jika bidang memiliki fokus. Saya memanggil fungsi di onSaveInstanceState jadi saya tidak perlu menyimpan bendera (mEditing) sebagai status tampilan EditText dan saat tombol penting diklik dan saat aktivitas ditutup.
Hati-hati dengan TexWatcher karena sering dipanggil saya menggunakan kondisi fokus agar tidak bereaksi ketika kode onRestoreInstanceState memasukkan teks. saya
sumber
Saya telah melakukan sesuatu seperti kelas abstrak ini yang dapat digunakan untuk menggantikan tipe TextView.OnEditorActionListener.
sumber
Sederhana untuk memicu selesai mengetik di EditText
bekerja untuk saya, jika Anda menggunakan java mengubahnya
Di Kotlin
sumber