Android TextWatcher. afterTextChanged so với TextWatcher.onTextChanged


121

Trong những trường hợp nào tôi nên sử dụng afterTextChangedthay vì onTextChangedvà ngược lại?

Câu trả lời:


199

Các sự kiện này được gọi theo thứ tự sau:

  1. beforeTextChanged (CharSequence s, int start, int count, int after) .
    Điều này có nghĩa là các ký tự sắp được thay thế bằng một số văn bản mới. Văn bản không thể chỉnh sửa.
    Sử dụng: khi bạn cần xem lại văn bản cũ sắp thay đổi.

  2. onTextChanged (CharSequence s, int start, int before, int count) .
    Các thay đổi đã được thực hiện, một số ký tự vừa được thay thế. Văn bản không thể chỉnh sửa.
    Sử dụng: khi bạn cần xem ký tự nào trong văn bản là mới.

  3. afterTextChanged (Có thể chỉnh sửa) .
    Tương tự như trên, ngoại trừ bây giờ văn bản có thể chỉnh sửa .
    Sử dụng: khi bạn cần xem và có thể chỉnh sửa văn bản mới.

Nếu tôi chỉ lắng nghe các thay đổi trong EditText, tôi sẽ không cần phải sử dụng hai phương pháp đầu tiên. Tôi sẽ chỉ nhận các giá trị mới trong phương thức thứ ba và sửa văn bản mới nếu cần. Tuy nhiên, nếu tôi phải theo dõi các thay đổi chính xác xảy ra với các giá trị, tôi sẽ sử dụng hai phương pháp đầu tiên. Nếu tôi cũng có nhu cầu chỉnh sửa văn bản sau khi nghe các thay đổi, tôi sẽ thực hiện điều đó trong phương pháp thứ ba.


Đã giúp tôi hiểu tại sao việc thay đổi văn bản trong onTextChanged lại dẫn đến ANR.
Sukhvir Singh

12

public void afterTextChanged (Có thể chỉnh sửa)

Phương thức này được gọi để thông báo cho bạn rằng, ở đâu đó bên trong s, văn bản đã được thay đổi. Việc thực hiện các thay đổi tiếp theo stừ lệnh gọi lại này là hợp pháp , nhưng hãy cẩn thận để không đưa mình vào một vòng lặp vô hạn, bởi vì bất kỳ thay đổi nào bạn thực hiện sẽ khiến phương thức này được gọi lại một cách đệ quy. (Bạn không nói nơi sự thay đổi đã diễn ra vì afterTextChanged khác () phương pháp có thể đã thực hiện thay đổi khác và không còn giá trị offsets. Nhưng nếu bạn cần phải biết ở đây, bạn có thể sử dụng setSpan(Object, int, int, int)trong onTextChanged(CharSequence, int, int, int)để đánh dấu vị trí của bạn và sau đó nhìn lên từ đây nơi kết thúc khoảng thời gian.

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

Phương thức này được gọi để thông báo cho bạn rằng, bên trong s, các countký tự bắt đầu ở startđó sắp được thay thế bằng văn bản mới có độ dài after. Đó là một lỗi khi cố gắng thực hiện các thay đổi stừ cuộc gọi lại này.

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

Phương thức này được gọi để thông báo cho bạn rằng, bên trong s, các countký tự bắt đầu startvừa thay thế văn bản cũ có độ dài before. Đó là một lỗi khi cố gắng thực hiện các thay đổi stừ cuộc gọi lại này.

Ngay từ Tham chiếu của Android cho TextWatcher .


Tại sao bạn chỉ sao chép mã API? Nhiều khi API "con người không thể đọc được".
matua

@matua Câu hỏi / câu trả lời này là từ hơn 11 năm trước.
GregD

thì bình luận sẽ bị chặn, tôi đoán :)
matua

0

Android Textwatcher là một loại trình kích hoạt được gọi khi thay đổi văn bản của trường đầu vào.

afterTextChanged (Editable s)- Phương thức này được gọi khi văn bản đã được thay đổi. Bởi vì bất kỳ thay đổi nào bạn thực hiện sẽ khiến phương thức này được gọi lại một cách đệ quy, bạn phải cẩn thận khi thực hiện các thao tác ở đây, nếu không nó có thể dẫn đến vòng lặp vô hạn .

onTextChanged (CharSequence s, int start, int before, int count)- Phương thức này được gọi để thông báo cho bạn rằng, trong vòng s, các ký tự đếm bắt đầu ở đầu vừa thay thế văn bản cũ có độ dài trước đó. Đó là một lỗi khi cố gắng thực hiện các thay đổi đối với s từ lệnh gọi lại này.


6
Sao chép / dán tài liệu không hữu ích và không trả lời câu hỏi.
David Wasser
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.