首页 文章

退格后TextWatcher.afterTextChanged的字符串不正确

提问于
浏览
4

我正在使用TextWatcher来收听关键输入 . 当用户输入'@'时,我打开一个listactivity,用户必须从列表中选择 . 选择后,我将所选项目的文本(包括初始@)放到edittext中,然后进行正常编辑 .

问题是,当我按退格键时,我在aftertextchanged事件中得到的字符串是错误的,并且listactivity再次弹出 .

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

        }

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

        }

        @Override
        public void afterTextChanged(Editable s)
        {
            String str = s.toString();

            if (str.length() > 0)
            {
                if (str.substring(str.length() - 1).equals("@"))
                {
                    Intent i = new Intent(MessageComposeActivity.this, MembersListActivity.class);
                    startActivityForResult(i, Util.MEMBERS_LIST);
                }
            }
        }
    });

在onActivityResult中:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == Util.MEMBERS_LIST)
        if (resultCode == RESULT_OK)
        {
            editText.setText(editText.getText().toString() + data.getExtras().get("screenname") + " ");
            editText.setSelection(editText.getText().length());
        }
}

For example:

在EditText中输入'@',弹出活动,我选择'James' . EditText现在显示@James . 如果我按退格键一次或两次,则当EditText显示@Jam时,listactivity会再次弹出 .

PS:afterTextChanged()有时会为退格(或任何键)调用两次,在afterTextChanged()的第二次执行时我得到错误的输入字符串 . 在第一次执行afterTextChanged()时,我得到@Jam,在第二次执行时,我得到'@',因此listactivity弹出 .

Question: 为什么afterTextChanged()被调用两次,为什么在第二次执行时我得到错误的文本?

非常感谢 .

1 回答

  • 1

    我有同样的问题 . 我不知道是什么原因导致0长度可编辑/字符序列的额外错误回调 .

    我在EditText上寻找实际导致空EditText的更改 . 我最终必须实现一个Handler来检查500 ms后的EditText长度 . 您可能必须使您的edittext静态或最终 . 它应该看起来像这样:

    final Handler handler =new Handler();
         final Runnable r = new Runnable(){
    
             @Override
             public void run()
             {
                //
    
                 String str = editText.getText().toString();
    
                 if (str.length() > 0)
                 {
                     if (str.substring(str.length() - 1).equals("@"))
                     {
                         Intent i = new Intent(MessageComposeActivity.this, MembersListActivity.class);
                         startActivityForResult(i, Util.MEMBERS_LIST);
                     }
                 }
             }
         } ;
    
    
    
        editText.addTextChangedListener(new TextWatcher()
        {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3)
            {
    
            }
    
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i2, int i3)
            {
    
            }
    
            @Override
            public void afterTextChanged(Editable s)
            {
    
                handler.postDelayed(r,500);
    
            }
        });
    

相关问题