Câu trả lời ngắn
Bạn có thể kiểm tra Chế độ xem nào hiện có tiêu điểm để phân biệt giữa sự kiện do người dùng và chương trình kích hoạt.
EditText myEditText = (EditText) findViewById(R.id.myEditText);
myEditText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (myEditText.hasFocus()) {
// is only executed if the EditText was directly changed by the user
}
}
//...
});
Câu trả lời dài
Như một phần bổ sung cho câu trả lời ngắn gọn: Trong trường hợp myEditText
đã có tiêu điểm khi bạn thay đổi theo chương trình văn bản bạn nên gọi clearFocus()
, thì bạn gọi setText(...)
và sau khi bạn yêu cầu lại tiêu điểm. Sẽ là một ý kiến hay nếu đặt nó vào một chức năng tiện ích:
void updateText(EditText editText, String text) {
boolean focussed = editText.hasFocus();
if (focussed) {
editText.clearFocus();
}
editText.setText(text);
if (focussed) {
editText.requestFocus();
}
}
Đối với Kotlin:
Vì Kotlin hỗ trợ các chức năng mở rộng, chức năng tiện ích của bạn có thể trông giống như sau:
fun EditText.updateText(text: String) {
val focussed = hasFocus()
if (focussed) {
clearFocus()
}
setText(text)
if (focussed) {
requestFocus()
}
}