使用TextWatchers的两个EditText小部件会导致无限循环

时间:2016-02-17 12:34:42

标签: android android-edittext infinite-loop textwatcher

我有一个有趣的问题。我正在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字段的最佳做法是什么。提前谢谢。

1 个答案:

答案 0 :(得分:1)

你必须使用

removeTextWatcher(nameDataTextWatcher);
每当您修改第二个编辑文本的内容时,从第一个edittext

删除他们的文本观察者。一旦修改完成,你必须再次添加相同的文本观察器