Activity 實現 TextWatcher 並同時註冊到多個 EditText,在 onTextChanged 中無法直接知曉是哪個輸入框觸發。
TextWatcher watcher1 = new TextWatcher() {
@Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override public void onTextChanged(CharSequence s, int start, int before, int count) {
handleInput(text1, s.toString());
}
@Override public void afterTextChanged(Editable s) {}
};
TextWatcher watcher2 = new TextWatcher() {
@Override public void onTextChanged(CharSequence s, int start, int before, int count) {
handleInput(text2, s.toString());
}
// ... 其他方法留空
};
text1.addTextChangedListener(watcher1);
text2.addTextChangedListener(watcher2);
View.getId() 或 Editable 實例判斷來源,減少錯誤。若多個欄位驗證邏輯相似,可封裝工廠方法:
private TextWatcher createWatcher(final EditText target, final Validator validator) {
return new TextWatcher() {
@Override public void onTextChanged(CharSequence s, int start, int before, int count) {
validator.validate(target, s.toString());
}
// ...
};
}