我有一个有趣的问题。我正在android中构建一个联系人应用程序。我有一个EditText
字段用于显示名称(所有名称字段的连接)和一个EditText
用于每个名称部分(名称,姓氏,昵称)。我想要实现的是,在显示名称EditText
的任何更改中 - 相应的EditText
内容将发生变化,反之亦然 - 任何EditText
名称部分的任何更改 - 显示名称内容将立即更改。为此,我在每个TextWatcher
中使用EditText
,在显示名称中使用一个:
displayName.addTextChangedListener(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) {
}
@Override
public void afterTextChanged(Editable s) {
parseNameFieldInput(result);
}
});
nameData.addTextChangedListener(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) {
}
@Override
public void afterTextChanged(Editable s) {
recalculateDisplayName();
}
});
导致无限循环,因为parseNameFieldInput
触发了名称EditText
的afterTextChanged,并且它依次触发了显示名称的afterTextChanged。我决定在方法中添加一个布尔锁来实现所需的行为:
@Override
public void afterTextChanged(Editable s) {
if(lock) return;
lock = true;
parseNameFieldInput(result);
lock = false;
}
});
@Override
public void afterTextChanged(Editable s) {
if(lock) return;
lock = true;
recalculateDisplayName();
lock = false;
}
现在流程似乎按预期工作,但如果我做得对,我仍然怀疑。问题是,使用EditText
实现多个可能导致无限循环的TextWatchers
字段的最佳做法是什么。提前谢谢。
答案 0 :(得分:1)
你必须使用
removeTextWatcher(nameDataTextWatcher);
每当您修改第二个编辑文本的内容时,从第一个edittext 删除他们的文本观察者。一旦修改完成,你必须再次添加相同的文本观察器