如何在 EditText TextChangedListener 中删除递归



我想从编辑文本中剔除一些不好的词。父亲叔叔表哥金将...但问题是,如果我更改文本,它会再次更改处理程序。任何人都知道解决方案。请帮忙。代码就在那里。

search_name.addTextChangedListener(new TextWatcher(){
        public void afterTextChanged(Editable s) {
            search_name.setText(s.toString().replace("something", "s**ething"));
            // here comes it repeatedly
        }
        public void beforeTextChanged(CharSequence s, int start, int count, int after){}
        public void onTextChanged(CharSequence s, int start, int before, int count){}
    });

我同意@njzk2评论re:InputFilter,如果递归是你想要解决的麻烦,你可以尝试这样的事情来防止它:

// make your TextWatcher a class variable
protected TextWatcher mTextWatcher = new TextWatcher()
    {
        public void afterTextChanged(Editable s) {
            textFixerUpper(search_name, s.toString());
        }
        public void beforeTextChanged(CharSequence s, int start, int count, int after){}
        public void onTextChanged(CharSequence s, int start, int before, int count){}
    };

protected textFixerUpper(EditText t, String s)
{
 t.removeTextChangedListener(mTextWatcher);             // remove the listener
 t.setText(s.replace("something", "s**ething"));        // update the text
 t.addTextChangedListener(mTextWatcher);                // add the listener back
}

或者通过设置布尔标志而不是删除并重新添加侦听器。虽然两者都看起来有点混乱。

您可以通过afterTextChanged(e: Editable)方法提供的实例Editable操作文本:

val textWatcher = object : TextWatcher {
    override fun afterTextChanged(e: Editable) {
        e.insert(0, "Hello World")
        // e.delete(st, en) ...
    }
    override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { }
    override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { }
}

在此方案中不调用侦听器方法。

我已经用变量解决了它。从@njzk2那里得到想法

int checker = 0;
search_name.addTextChangedListener(new TextWatcher(){
        public void afterTextChanged(Editable s) {
            checker = 0;
        }
        public void beforeTextChanged(CharSequence s, int start, int count, int after){}
        public void onTextChanged(CharSequence s, int start, int before, int count){
            if(checker!=1)
            {    
               checker = 1;
               search_name.setText(s.toString().replace("something", "s**ething"));
            }
        }
    });

最简单的方法是控制countbefore

view.addTextChangedListener(
    ...
    @Override
    public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
        if ( count - before != 0) {
            onTextChange(charSequence);
        }
    }
);

最新更新