Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从textwatcher访问edittext_Java_Android - Fatal编程技术网

Java 从textwatcher访问edittext

Java 从textwatcher访问edittext,java,android,Java,Android,我正在使用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){

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

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

在更改文本监视程序中的文本之前,应先删除它。

可能会)

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

不是最好的溶液,但看看 试试这个

最终EditText et=(EditText)findViewById(R.id.editText1); 最终文本视图电视=(文本视图)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) {}
});
这样试试

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

这样可以防止无限循环

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

最终应该不是问题……你能提供日志猫吗……但我需要更改用户键入的内容,例如,如果他键入“A”,我将显示“D”,使它看起来像他键入的“D”因此,我需要在虚拟键盘上使用一个侦听器,该侦听器为我提供按下的字符。在调用setText之前,您的TextWatcher从EditText中删除该侦听器。在调用setText之后,立即使用AddTextChangedListener重新添加TextWatcher。无法退出无限循环:/!!我没有观察到任何无限循环e循环?s.长度()将为1,第二次为0@Agarwal:也许你是对的,这是我的看法,因为在代码中,et在后文本更改中被设置,所以它将再次调用文本观察程序等等…这就是为什么他会得到Stackoverflow异常…即使我有点怀疑,如果他每次设置“”那么应该生成相同的文本textchange调用吗?但是查看log cat,它是这样的,因为存在Stackoverflow异常…@Agarwal运行回调代码替代调用…。我编辑了答案,请查看…。当我将et.setText(“”)替换为et.setText(“任何”)时;我再次遇到堆栈溢出et必须保持为空提供的代码可能会有所帮助,但为了使其成为一个好的答案,您还应该描述/解释您的代码解决问题的原因/方式。