Android TextWatcher.afterTextChanged ve TextWatcher.onTextChanged


122

afterTextChangedBunun yerine hangi durumlarda kullanmalıyım onTextChangedve bunun tersi de geçerlidir?

Yanıtlar:


199

Bu olaylar aşağıdaki sırayla çağrılır:

  1. beforeTextChanged (CharSequence s, int start, int count, int after) .
    Bu, karakterlerin yeni bir metinle değiştirilmek üzere olduğu anlamına gelir. Metin düzenlenemez.
    Kullanın: değişmek üzere olan eski metne bakmanız gerektiğinde.

  2. onTextChanged (CharSequence s, int start, int before, int count) .
    Değişiklikler yapıldı, bazı karakterler yeni değiştirildi. Metin düzenlenemez.
    Kullanın: metindeki hangi karakterlerin yeni olduğunu görmeniz gerektiğinde.

  3. afterTextChanged (Düzenlenebilir ler) .
    Yukarıdakinin aynısı, ancak artık metin düzenlenebilir .
    Kullanın: yeni metni görmeniz ve muhtemelen düzenlemeniz gerektiğinde.

Sadece değişiklik olup EditTextolmadığını dinliyorsam , ilk iki yöntemi hiç kullanmam gerekmeyecek. Sadece üçüncü yöntemde yeni değerler alacağım ve gerekirse yeni metni düzelteceğim. Bununla birlikte, değerlerde meydana gelen tam değişiklikleri izlemem gerekirse, ilk iki yöntemi kullanırdım. Değişiklikleri dinledikten sonra metni de düzenlemeye ihtiyacım olsaydı, bunu üçüncü yöntemde yapardım.


OnTextChanged'deki metni değiştirmenin neden ANR'ye yol açtığını anlamama yardımcı oldu.
Sukhvir Singh

12

public void afterTextChanged (Düzenlenebilir s)

Bu yöntem, smetnin içinde bir yerde değiştiğini size bildirmek için çağrılır . sBu geri aramadan daha fazla değişiklik yapmak meşru , ancak kendinizi sonsuz bir döngüye sokmamaya dikkat edin, çünkü yaptığınız herhangi bir değişiklik bu yöntemin yinelemeli olarak yeniden çağrılmasına neden olacaktır. (Diğer afterTextChanged () yöntemleri zaten başka değişiklikler yapmış ve uzaklıklar geçersiz olabilir, çünkü değişim gerçekleşti nerede söyledi değildir. Ama burada bilmek gerekiyorsa, kullanabilirsiniz setSpan(Object, int, int, int)içinde onTextChanged(CharSequence, int, int, int)yerinizi işaretlemek için ve daha sonra burada yerden bakmak aralık sona erdi.

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

İçinde bu yöntem, size bildirmek için çağrılır s, countbaşlayan karakterler startuzunluğunda yeni metin olarak yerleştirilecek üzeresiniz after. sBu geri aramadan üzerinde değişiklik yapmaya çalışmak bir hatadır .

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

Bu yöntem dahilinde, size bildirmek için çağrılır s, countbaşlayan karakterler startsadece uzunluğuna sahip olduğu eski metni yerini almıştır before. sBu geri aramadan üzerinde değişiklik yapmaya çalışmak bir hatadır .

Doğrudan Android'in TextWatcher Referansı'ndan .


Neden API kodunu kopyaladınız? Çoğu zaman API "insan tarafından okunamaz" dır.
matua

@matua Bu soru / cevap 11 yılı aşkın bir süredir.
GregD

sanırım yorumlar engellenmeli :)
matua

0

Android Textwatcher bir giriş alanının metin değişikliğinde çağrılan bir tür tetikleyicidir.

afterTextChanged (Editable s)- Bu yöntem, metin değiştirildiğinde çağrılır. Yapacağınız herhangi bir değişiklik bu yöntemin yinelemeli olarak yeniden çağrılmasına neden olacağından, burada işlem yapma konusunda dikkatli olmanız gerekir, aksi takdirde sonsuz döngüye yol açabilir .

onTextChanged (CharSequence s, int start, int before, int count)- Bu yöntem, s içinde, başlangıçta başlayan sayı karakterlerinin daha önce uzunluğu olan eski metnin yerini aldığını size bildirmek için çağrılır. Bu geri aramadan 'ler üzerinde değişiklik yapmaya çalışmak bir hatadır.


6
Belgeleri kopyalayıp yapıştırmak yardımcı olmaz ve soruyu yanıtlamaz.
David Wasser
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.