-2

我正在使用 textWatcher :

final EditText et = (EditText) findViewById(R.id.editText1);
final TextView tv = (TextView) findViewById(R.id.textView2);

    et.addTextChangedListener(new TextWatcher()
    {
            public void afterTextChanged(Editable s){
                    if(s.length() > 0) {
                    tv.setText(s.toString().substring(s.length()-1));
                    et.setText("");
                }
            }
            public void beforeTextChanged(CharSequence s,int start,int count, int after){} 
            public void onTextChanged(CharSequence s, int start, int before, int count) {}
    });

这个返回错误,我无法访问et.setText,因为它可能是最终的或者因为它被键盘锁定了,知道吗?

日志猫:

06-02 13:35:25.139: D/AndroidRuntime(12532): Shutting down VM
06-02 13:35:25.139: W/dalvikvm(12532): threadid=1: thread exiting with uncaught exception (group=0x40018578)
06-02 13:35:25.219: E/AndroidRuntime(12532): FATAL EXCEPTION: main
06-02 13:35:25.219: E/AndroidRuntime(12532): java.lang.StackOverflowError
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView$InsertionPointCursorController.hide(TextView.java:8609)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.hideInsertionPointCursorController(TextView.java:9088)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.hideControllers(TextView.java:9105)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2677)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2662)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.EditText.setText(EditText.java:178)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2637)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at com.pack.witch.Input$1.beforeTextChanged(Input.java:27)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.sendBeforeTextChanged(TextView.java:6554)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2702)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2662)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.EditText.setText(EditText.java:178)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2637)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at com.pack.witch.Input$1.beforeTextChanged(Input.java:27)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.sendBeforeTextChanged(TextView.java:6554)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2702)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2662)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.EditText.setText(EditText.java:178)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2637)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at com.pack.witch.Input$1.beforeTextChanged(Input.java:27)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.sendBeforeTextChanged(TextView.java:6554)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2702)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2662)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.EditText.setText(EditText.java:178)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2637)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at com.pack.witch.Input$1.beforeTextChanged(Input.java:27)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.sendBeforeTextChanged(TextView.java:6554)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2702)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2662)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.EditText.setText(EditText.java:178)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2637)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at com.pack.witch.Input$1.beforeTextChanged(Input.java:27)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.sendBeforeTextChanged(TextView.java:6554)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2702)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2662)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.EditText.setText(EditText.java:178)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2637)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at com.pack.witch.Input$1.beforeTextChanged(Input.java:27)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.sendBeforeTextChanged(TextView.java:6554)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2702)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2662)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.EditText.setText(EditText.java:178)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2637)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at com.pack.witch.Input$1.beforeTextChanged(Input.java:27)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.sendBeforeTextChanged(TextView.java:6554)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2702)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2662)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.EditText.setText(EditText.java:178)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2637)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at com.pack.witch.Input$1.beforeTextChanged(Input.java:27)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.sendBeforeTextChanged(TextView.java:6554)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2702)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2662)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.EditText.setText(EditText.java:178)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2637)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at com.pack.witch.Input$1.beforeTextChanged(Input.java:27)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.sendBeforeTextChanged(TextView.java:6554)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2702)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2662)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.EditText.setText(EditText.java:178)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2637)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at com.pack.witch.Input$1.beforeTextChanged(Input.java:27)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.sendBeforeTextChanged(TextView.java:6554)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2702)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2662)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.EditText.setText(EditText.java:178)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at android.widget.TextView.setText(TextView.java:2637)
06-02 13:35:25.219: E/AndroidRuntime(12532):    at com.pack.witch.Input

Ps:我需要更改用户键入的内容,例如,如果他键入“A”,我将显示“D”,这看起来就像他键入“D”

4

4 回答 4

2

这是堆栈溢出。文本正在改变,它调用文本观察器,它改变了调用你的文本观察器的文本,它改变了调用你的文本观察器的文本......

您应该在更改其中的文本之前删除您的文本观察器。

于 2012-06-02T12:37:51.617 回答
1

可能是http://developer.android.com/reference/android/text/TextWatcher.html#afterTextChanged(android.text.Editable )

调用此方法是为了通知您,在 s 中的某处,文本已更改。从此回调中对 s 进行进一步更改是合法的,但请注意不要让自己陷入无限循环,因为您所做的任何更改都会导致再次递归调用此方法。(您不会被告知更改发生的位置,因为其他 afterTextChanged() 方法可能已经进行了其他更改并使偏移量无效。但是如果您需要在这里知道,

不是最好的解决方案,但看看试试这个

如何使用 TextWatcher 更新相同的 EditText?

或者

最后的 EditText et = (EditText) findViewById(R.id.editText1); final TextView tv = (TextView) findViewById(R.id.textView2); 布尔 isManulChange = false;

et.addTextChangedListener(new TextWatcher()
{
        public void afterTextChanged(Editable s){

                if(isManulChange ){
                     isManulChange   = false;
                     return;
                   }

                if(s.length() > 0) {
                tv.setText(s.toString().substring(s.length()-1));
                et.setText("");
                isManulChange   = true;//
            }
        }
        public void beforeTextChanged(CharSequence s,int start,int count, int after){} 
        public void onTextChanged(CharSequence s, int start, int before, int count) {}
});
于 2012-06-02T12:40:58.447 回答
1

试试这个方法

final EditText et = (EditText) findViewById(R.id.editText1);
final TextView tv = (TextView) findViewById(R.id.textView2);

et.addTextChangedListener(new TextWatcher()
{
        public void afterTextChanged(Editable s){

            }
        }
        public void beforeTextChanged(CharSequence s,int start,int count, int after){} 
        public void onTextChanged(CharSequence s, int start, int before, int count) {
                if(s.length() > 0) {
                tv.setText(s.toString().substring(s.length()-1));
                et.setText("");}
         }
});
于 2012-06-02T13:00:31.283 回答
0

通过这个你可以防止无限循环

@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
    if (textWatchEdited) {
        textWatchEdited = false;
        return;
    }
    String str = charSequence.toString();
    // do something
    textWatchEdited = true;
    view.setText(str);
}
于 2015-04-19T08:20:42.113 回答