在我的Android应用程序中,我需要实现TextWatcher接口来实现onTextChanged。我的问题是,我想用一些额外的字符串更新相同的EditText。当我尝试这样做时,程序终止。

 final EditText ET = (EditText) findViewById(R.id.editText1);
 ET.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count)
        {
            try
            {
                 ET.setText("***"+ s.toString());
                 ET.setSelection(s.length());
            }
            catch(Exception e)
            {
                Log.v("State", e.getMessage());
            }
        }

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

        }

        @Override
        public void afterTextChanged(Editable s)
        {
        }
    });

我的程序终止,甚至我尝试捕获异常,就像在代码中一样,它仍然终止。
有谁知道为什么会发生这种情况以及我如何实现这一目标?谢谢。

最佳答案

TextView事件的内容不可编辑。

相反,您需要处理onTextChanged事件才能对文本进行更改。

有关更详尽的解释,请参见:Android TextWatcher.afterTextChanged vs TextWatcher.onTextChanged

注意:错误afterTextChanged
显然,通过不断更改onTextChanged事件上的文本,您将导致无限循环。

the ref:

公共抽象void afterTextChanged(Editable s)
调用此方法以通知您s内某处的文本已经
改变了。对此进行进一步更改是合理的
回调,但请注意不要陷入无限循环,
因为您所做的任何更改都会导致再次调用此方法
递归地...

  • 建议1 :如果可以,请检查触发事件时afterTextChanged是否已经是您想要的。
    @Override
    public void afterTextChanged(Editable s)
    {
        if( !s.equalsIngoreCase("smth defined previously"))
             s = "smth defined previously";
    }
    
  • 建议2 :如果您需要做更复杂的事情(格式,
    验证),您可以像thispost.
  • 一样使用s方法


    注2 :将输入格式化为部分隐藏的n个星,直到最后4个字符(**** 4)

    您可以在建议1中使用类似的方法:
        @Override
        public void afterTextChanged(Editable s)
        {
           String sText = ET.getText().toString()
    
            if( !isFormatted(sText))
                 s = format(sText);
        }
        bool isFormatted(String s)
        {
         //check if s is already formatted
        }
    
        string format(String s)
        {
          //format s & return
        }
    

    07-26 02:51