从textwatcher访问edittext

我正在使用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”

试试这种方式

 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("");} } }); 

这是堆栈溢出。 文本正在改变调用文本观察者,它会更改调用文本观察者的文本,这会改变调用文本观察者的文本…

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

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

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

不是beest soulution但是看看试试这个

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

要么

final EditText et =(EditText)findViewById(R.id.editText1); final TextView tv =(TextView)findViewById(R.id.textView2); boolean 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) {} }); 

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

 @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); }