Jawaban singkat
Anda dapat memeriksa Tampilan mana yang saat ini memiliki fokus untuk membedakan antara peristiwa yang dipicu oleh pengguna dan program.
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
}
}
//...
});
Jawaban panjang
Sebagai tambahan untuk jawaban singkat: Jika myEditTextsudah memiliki fokus ketika Anda secara terprogram mengubah teks yang harus Anda panggil clearFocus(), kemudian Anda memanggil setText(...)dan setelah Anda meminta ulang fokus. Ini akan menjadi ide yang bagus untuk memasukkannya ke dalam fungsi utilitas:
void updateText(EditText editText, String text) {
boolean focussed = editText.hasFocus();
if (focussed) {
editText.clearFocus();
}
editText.setText(text);
if (focussed) {
editText.requestFocus();
}
}
Untuk Kotlin:
Karena Kotlin mendukung fungsi ekstensi, fungsi utilitas Anda akan terlihat seperti ini:
fun EditText.updateText(text: String) {
val focussed = hasFocus()
if (focussed) {
clearFocus()
}
setText(text)
if (focussed) {
requestFocus()
}
}