最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【已解决】Android中给EditText添加的TextWatcher中的onTextChanged始终被调用(被执行多次)

Android crifan 8735浏览 0评论

【问题】

Android中,给一个EditText添加了TextWatcher,其中实现了onTextChanged,

但是出现个问题:

对于EditText,只修改了一次(比如用删除键删除一个字符)

但是onTextChanged却始终被调用

被调用了多次。

相关部分的代码为:

TextWatcher mVarValueTextWatcher;

  mVarValueTextWatcher = 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) {
          validateVarValue(curEditVarEdittext);
         }
   @Override
   public void afterTextChanged(Editable arg0) {
   
   }
      };

EditText variableValueView = (EditText) variableLayout.findViewById(R.id.variableValue);
variableValueView.addTextChangedListener(mVarValueTextWatcher);

【解决过程】

1.搜:

android onTextChanged always

android – onTextChanged() method called without calling setText() or user’s typing – Stack Overflow

然后看看自己的代码,果然也是有onSaveInstanceState的:

 @Override
 public void onSaveInstanceState(Bundle outState) {
  // Serialize the current tab position.
  outState.putInt(STATE_SELECTED_NAVIGATION_ITEM, getActionBar()
    .getSelectedNavigationIndex());
 }

不过我这里并没有保存那些EditText的state,所以上述代码应该没影响的。

2.参考:

addTextChangedListener and onTextChanged are always called when Android Fragment loads – Stack Overflow

但是没用。

3.搜:

android onTextChanged multiple

参考:

android – How to avoid multiple triggers on EditText while user is typing? – Stack Overflow

但是先去改为:

  mVarValueTextWatcher = 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) {
          //validateVarValue(curEditVarEdittext);
         }
   @Override
   public void afterTextChanged(Editable arg0) {
    validateVarValue(curEditVarEdittext);
   }
      };

结果是:

好像就可以了:

虽然afterTextChanged也会被调用多次,但是至少不会卡死不让输入。

4.不过参考:

android – TextWatcher events are being fired multiple times – Stack Overflow

去试试,把inputType设置为textNoSuggestions:

参考:

InputType | Android Developers

去改为:

    //inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS;
    inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS;

然后去看看效果:

果然真的只被调用一次了。

当用退格键删除一个字符后,只被调用了一次->没有被调用多次。

 

【总结】

此处好像是由于android中对于EditText来说,默认给InputType是属于那种带自动提示的,类似于TYPE_TEXT_FLAG_NO_SUGGESTIONS之类的,然后导致文本被修改后,系统自动去做建议suggestion,然后导致多次调用。

所以把类型改为:

inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS;

就可以解决问题了:

当文本被修改后,没了suggestion,就不会被多次调用了。

转载请注明:在路上 » 【已解决】Android中给EditText添加的TextWatcher中的onTextChanged始终被调用(被执行多次)

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
83 queries in 0.164 seconds, using 22.06MB memory