Saya memiliki EditText
bidang dengan Pengamat Teks Pelanggan di atasnya. Dalam sepotong kode saya perlu mengubah nilai di EditText yang saya gunakan .setText("whatever")
.
Masalahnya adalah segera setelah saya melakukan perubahan itu afterTextChanged
metode dipanggil yang menciptakan loop tak terbatas. Bagaimana cara mengubah teks tanpa memicu afterTextChanged?
Saya membutuhkan teks dalam metode afterTextChanged jadi jangan menyarankan menghapus file TextWatcher
.
java
android
event-handling
infinite-loop
pengguna1143767
sumber
sumber
Jawaban singkat
Anda dapat memeriksa Tampilan mana yang saat ini memiliki fokus untuk membedakan antara peristiwa yang dipicu oleh pengguna dan program.
Jawaban panjang
Sebagai tambahan untuk jawaban singkat: Jika
myEditText
sudah memiliki fokus ketika Anda secara terprogram mengubah teks yang harus Anda panggilclearFocus()
, kemudian Anda memanggilsetText(...)
dan setelah Anda meminta ulang fokus. Ini akan menjadi ide yang bagus untuk memasukkannya ke dalam fungsi utilitas:Untuk Kotlin:
Karena Kotlin mendukung fungsi ekstensi, fungsi utilitas Anda akan terlihat seperti ini:
sumber
getActivity().getCurrentFocus()
dan kotlinactivity?.currentFocus
hasFocus()
langsung diEditText
.Pemakaian:
Anda mungkin merasa sedikit lambat saat memasukkan teks dengan cepat jika Anda menggunakan editText.setText () daripada editable.replace () .
sumber
Trik mudah untuk diperbaiki ... selama logika Anda untuk mendapatkan nilai teks edit baru idempoten (yang mungkin akan terjadi, tetapi hanya mengatakan). Dalam metode listener Anda, hanya ubah teks edit jika nilai saat ini berbeda dari terakhir kali Anda mengubah nilai.
misalnya,
sumber
setText()
dan menambahkannya kembali setelahnya.Saya menggunakan cara itu:
Dan setiap kali Anda perlu mengubah teks secara programatik, pertama-tama hapus fokusnya
sumber
Anda dapat menggunakan sintaks Kotlin DSL untuk mendapatkan solusi umum untuk ini:
Dan di dalam TextWatcher Anda, Anda dapat menggunakannya sebagai:
sumber
Ini bekerja dengan baik untuk saya
sumber
Masalahnya bisa diselesaikan dengan mudah menggunakan
tag
file dan Anda bahkan tidak perlu berurusan dengan fokus editText.Menyetel teks dan tag secara terprogram
Memeriksa
tag
di onTextChangedsumber
Jika Anda perlu tetap fokus pada
EditText
perubahan teks, Anda dapat meminta fokus:sumber
coba logika ini: Saya ingin setText ("") tanpa pergi ke loop tak terbatas dan kode ini bekerja untuk saya. Saya harap Anda dapat memodifikasi ini agar sesuai dengan kebutuhan Anda
sumber
Berikut adalah kelas praktis yang menyediakan antarmuka yang lebih sederhana daripada TextWatcher untuk kasus normal yang ingin melihat perubahan saat terjadi. Ini juga memungkinkan untuk mengabaikan perubahan berikutnya seperti yang diminta OP.
Gunakan seperti ini:
Kapan pun Anda ingin mengubah konten
editText
tanpa menyebabkan rangkaian pengeditan rekursif, lakukan ini:sumber
Variasi saya:
Setel pendengar hanya menggunakan setOnTextChangeListener () dan setel teks hanya menggunakan setNewText (Saya ingin mengganti setText (), tetapi ini sudah final)
sumber
Saya telah membuat kelas abstrak yang mengurangi masalah siklik ketika modifikasi pada EditText dibuat melalui TextWatcher.
sumber
Sangat sederhana, atur teks dengan metode ini
sumber
Anda harus memastikan penerapan perubahan teks Anda stabil dan tidak mengubah teks jika tidak ada perubahan yang diperlukan. Biasanya itu akan menjadi konten apa pun yang telah melalui pengamat sekali.
Kesalahan paling umum adalah menyetel teks baru di EditText terkait atau Editable meskipun teks sebenarnya tidak berubah.
Selain itu, jika Anda membuat perubahan ke Editable daripada beberapa Tampilan tertentu, Anda dapat dengan mudah menggunakan kembali pengamat Anda, dan juga Anda dapat mengujinya secara terpisah dengan beberapa unit test untuk memastikannya memiliki hasil yang Anda inginkan.
Karena Editable adalah antarmuka, Anda bahkan dapat menggunakan implementasi tiruannya yang menampilkan RuntimeException jika salah satu metodenya dipanggil yang mencoba mengubah kontennya, saat menguji konten yang seharusnya stabil.
sumber
Cara saya melakukan hal itu:
Di segmen tulis
Pendengar
Tetap berfungsi.
sumber