【问题标题】:TextWatcher.afterTextChanged has incorrect string after backspaceTextWatcher.afterTextChanged 在退格后的字符串不正确
【发布时间】:2013-01-23 20:32:40
【问题描述】:

我正在使用 TextWatcher 来监听按键输入。当用户键入“@”时,我打开一个列表活动,用户必须从列表中进行选择。一旦选择,我将所选项目的文本(包括初始@)放置到编辑文本并继续正常编辑。

问题是当我按退格时,我在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());
        }
}

例如:

在 EditText 中,我键入“@”,然后会弹出活动并选择“James”。 EditText 现在显示@James。 如果我按退格键一次或两次,则在 EditText 显示@Jam 时再次弹出列表活动。

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

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

非常感谢。

【问题讨论】:

  • 请不要“乞求错误”。很有可能它不是库中的错误.. 清楚地说明问题/问题并查看它的结果。
  • 任何可能的解决方案?
  • 我看到类似的东西,很想找到答案...

标签: android android-edittext textwatcher


【解决方案1】:

我遇到了完全相同的问题。我不知道是什么导致了长度为 0 的可编辑/字符序列的额外错误回调。

我正在寻找实际上导致空 EditText 的 EditText 的更改。我最终不得不实现一个处理程序来检查 500 毫秒后的 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);

        }
    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2013-08-22
    相关资源
    最近更新 更多