Android TextWatcher.afterTextChanged vs TextWatcher.onTextChanged

122

Dalam keadaan apa yang harus saya gunakan afterTextChangedsebagai pengganti onTextChangeddan sebaliknya?

Akan
sumber

Jawaban:

199

Peristiwa ini dipanggil dalam urutan berikut:

  1. beforeTextChanged (CharSequence s, int start, int count, int after) .
    Ini berarti karakter akan diganti dengan beberapa teks baru. Teks tidak bisa diedit.
    Gunakan: saat Anda perlu melihat teks lama yang akan berubah.

  2. onTextChanged (CharSequence s, int start, int before, int count) .
    Perubahan telah dilakukan, beberapa karakter baru saja diganti. Teks tidak bisa diedit.
    Gunakan: saat Anda perlu melihat karakter mana dalam teks yang baru.

  3. afterTextChanged (Dapat diedit) .
    Sama seperti di atas, kecuali sekarang teksnya dapat diedit .
    Gunakan: saat Anda perlu melihat dan mungkin mengedit teks baru.

Jika saya hanya mendengarkan perubahan EditText, saya tidak perlu menggunakan dua metode pertama sama sekali. Saya hanya akan menerima nilai baru dalam metode ketiga dan mengoreksi teks baru jika diperlukan. Namun, jika saya harus melacak perubahan tepat yang terjadi pada nilai, saya akan menggunakan dua metode pertama. Jika saya juga perlu mengedit teks setelah mendengarkan perubahan, saya akan melakukannya di metode ketiga.

Malcolm
sumber
Membantu saya memahami mengapa mengubah teks di onTextChanged menyebabkan ANR.
Sukhvir Singh
12

public void afterTextChanged (Dapat diedit)

Metode ini dipanggil untuk memberi tahu Anda bahwa, di suatu tempat di dalam s, teks telah diubah. Anda sboleh membuat perubahan lebih lanjut dari callback ini, tetapi hati-hati jangan sampai Anda terjebak dalam loop tak terbatas, karena setiap perubahan yang Anda buat akan menyebabkan metode ini dipanggil lagi secara rekursif. (Anda tidak diberi tahu di mana perubahan itu terjadi karena metode afterTextChanged () lain mungkin sudah membuat perubahan lain dan membatalkan offset. Tetapi jika Anda perlu tahu di sini, Anda dapat menggunakan setSpan(Object, int, int, int)in onTextChanged(CharSequence, int, int, int)untuk menandai tempat Anda dan kemudian mencari dari sini di mana rentangnya berakhir.

public void beforeTextChanged (CharSequence s, int start, int count, int after)

Metode ini dipanggil untuk memberi tahu Anda bahwa, di dalam s, countkarakter yang dimulai pada startakan segera diganti dengan teks baru dengan panjang after. Ini adalah kesalahan untuk mencoba membuat perubahan sdari panggilan balik ini.

public void onTextChanged (CharSequence s, int start, int before, int count)

Metode ini dipanggil untuk memberi tahu Anda bahwa, di dalam s, countkarakter yang dimulai pada startbaru saja menggantikan teks lama yang memiliki panjang before. Ini adalah kesalahan untuk mencoba membuat perubahan sdari panggilan balik ini.

Langsung dari Referensi Android untuk TextWatcher .

GregD
sumber
Mengapa Anda hanya menyalin kode API? Seringkali API "tidak bisa dibaca manusia".
matua
@matua Tanya jawab ini lebih dari 11 tahun yang lalu.
GregD
maka komentar harus diblokir kurasa :)
matua
0

Android Textwatcher adalah salah satu jenis pemicu yang disebut pada perubahan teks dari bidang masukan.

afterTextChanged (Editable s)- Metode ini dipanggil ketika teks telah diubah. Karena setiap perubahan yang Anda buat akan menyebabkan metode ini dipanggil lagi secara rekursif, Anda harus berhati-hati dalam melakukan operasi di sini, jika tidak, ini dapat menyebabkan pengulangan tak terbatas .

onTextChanged (CharSequence s, int start, int before, int count)- Metode ini dipanggil untuk memberi tahu Anda bahwa, dalam s, hitungan karakter yang dimulai dari awal baru saja menggantikan teks lama yang memiliki panjang sebelumnya. Ini adalah kesalahan untuk mencoba membuat perubahan dari panggilan balik ini.

IntelliJ Amiya
sumber
6
Salin / tempel dokumentasi tidak membantu dan tidak menjawab pertanyaan.
David Wasser