如何避免在Android的EditText上onTextChanged的执行(How can I a

2019-08-01 07:08发布

我怎样才能避免一个代码行,如:

((EditText) findViewById(R.id.MyEditText)).setText("Hello");

将在这里产生的事件:

((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) {
}
});

我想知道是否有任何的方式来抑制onTextChanged的执行,因为我在选择AutoCompleteTextView的下拉结果的情况下发现(不onTextChanged执行!)。

我不是在寻找像“你好,如果什么都不做”的解决方法...

Answer 1:

对于源AutoCompleteTextView表明,他们设置一个布尔说文字是由块完成更换

         mBlockCompletion = true;
         replaceText(convertSelectionToString(selectedItem));
         mBlockCompletion = false;    

这是一个很好的方式与任何实现你想要做什么。 该TextWatcher然后检查,看看是否已经的setText通过来完成,并返回该方法的

 void doBeforeTextChanged() {
     if (mBlockCompletion) return;

添加和删​​除TextWatcher会更耗时的应用



Answer 2:

您可以检查哪些视图具有当前焦点区分之间的用户和程序触发的事件。

EditText myEditText = (EditText) findViewById(R.id.myEditText);

myEditText.addTextChangedListener(new TextWatcher() {
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

        if(getCurrentFocus() == myEditText) {
            // is only executed if the EditText was directly changed by the user
        }
    }

    //...
});


Answer 3:

另一种方式来实现,这将是使用setOnKeyListener

当用户按下一个键,而不是每当EditText上由用户或程序改变这只会触发。

myEditText.setOnKeyListener(new EditText.OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        switch(event.getAction()) {
            case KeyEvent.ACTION_DOWN:
                // beforeTextChanged
                break;      
            case KeyEvent.ACTION_UP:
                // afterTextChanged
                break;
        }
        return false;
    }
});


Answer 4:

我不认为有一个简单的方法来禁用监听器,但你可以通过避开它:

  • 卸下TextWatcher设置文本之前,和回来后添加。
  • 或者设置一个boolean设置文本,告诉前旗TextWatcher忽略它。

boolean ignoreNextTextChange = true;
((EditText) findViewById(R.id.MyEditText)).setText("Hello");

而在你TextWatcher

new TextWatcher() {
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        /*
        If the flag is set to ignore the next text change,
        reset the flag, and return without doing anything.
        */
        if (ignoreNextTextChange){
            ignoreNextTextChange = false;
            return;
        }
    }

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

    }

    @Override
    public void afterTextChanged(Editable s) {

    }
});

这是一个小哈克,但它应该工作:)



Answer 5:

或者,你可以简单地使用mEditText.hasFocus()文字是人类改变或程序发生变化,这工作得很好,我来区分:

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

希望这可以帮助!



Answer 6:

只有两个方法,我可以看到

  • 你检查监听内
  • 添加/根据特定的条件删除监听

作为第一种方式,是你不想要的解决办法我是怕你有解决与第二种方式。



文章来源: How can I avoid execution of onTextChanged in Android's EditText