如何避免在Android的EditText中执行onTextChanged

wil*_*ove 23 android android-edittext

我怎样才能避免代码行:

((EditText) findViewById(R.id.MyEditText)).setText("Hello");
Run Code Online (Sandbox Code Playgroud)

会在这里引发一个事件:

((EditText) findViewById(R.id.MyEditText)).addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start,
    int before, int count) {
// HERE
}

@Override
public void beforeTextChanged(CharSequence s, int start,
    int count, int after) {
}

@Override
public void afterTextChanged(Editable s) {
}
});
Run Code Online (Sandbox Code Playgroud)

我想知道是否有任何方法可以禁止onTextChanged的执行,因为我注意到在选择AutoCompleteTextView的下拉结果的情况下(没有执行onTextChanged!).

我不是在寻找像"如果你好无所事事"这样的解决方法......

Daz*_*y_G 25

AutoCompleteTextView的Source 显示它们设置了一个布尔值,表示文本正被块完成替换

         mBlockCompletion = true;
         replaceText(convertSelectionToString(selectedItem));
         mBlockCompletion = false;    
Run Code Online (Sandbox Code Playgroud)

这是达到你想要做的任何事情的好方法.然后TextWatcher检查以查看setText是否已通过完成并返回该方法

 void doBeforeTextChanged() {
     if (mBlockCompletion) return;
Run Code Online (Sandbox Code Playgroud)

添加和删​​除TextWatcher对于应用程序来说将更耗时


Wil*_*zel 12

您可以检查哪个View当前具有焦点,以区分用户和程序触发的事件.

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
        }
    }

    //...
});
Run Code Online (Sandbox Code Playgroud)


Jiy*_*yeh 5

或者,您可以简单地使用mEditText.hasFocus()区分人工更改或程序更改的文本,这对我来说很好用:

@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
    if (mEditText.hasFocus()) {
        // Do whatever
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!