【问题标题】:I got an error when I implement addTextChangedListener, how can I fix it?实现 addTextChangedListener 时出现错误,如何解决?
【发布时间】:2014-03-13 20:31:08
【问题描述】:

我创建了一个EditText 并设置了它addtextchangedlistener。 代码是:

 shared_tags.addTextChangedListener(new TextWatcher() {


    @Override
    public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
        // TODO Auto-generated method stub
        shared_tags.setText( shared_tags.getText().toString().toLowerCase().replace(" ", "#"));
    }

    @Override
    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
            int arg3) {
        // TODO Auto-generated method stub

    }

    @Override
    public void afterTextChanged(Editable arg0) {
        // TODO Auto-generated method stub

    }
});

但它给出的错误如下:

03-13 23:22:03.384: E/InputEventReceiver(19895): Exception dispatching input event.
03-13 23:22:03.384: E/MessageQueue-JNI(19895): Exception in MessageQueue callback: handleReceiveCallback
03-13 23:22:03.424: E/MessageQueue-JNI(19895): java.lang.StackOverflowError
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.graphics.Paint.getTextRunAdvances(Paint.java:1754)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.graphics.Paint.getTextRunAdvances(Paint.java:1720)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.text.MeasuredText.addStyleRun(MeasuredText.java:172)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.text.MeasuredText.addStyleRun(MeasuredText.java:212)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.text.StaticLayout.generate(StaticLayout.java:325)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.text.DynamicLayout.reflow(DynamicLayout.java:284)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.text.DynamicLayout.<init>(DynamicLayout.java:170)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.makeSingleLayout(TextView.java:6314)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.makeNewLayout(TextView.java:6208)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.checkForRelayout(TextView.java:6755)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.setText(TextView.java:3923)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.setText(TextView.java:3781)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.EditText.setText(EditText.java:99)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.setText(TextView.java:3756)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at com.wub.twostrangers.share_image$3.onTextChanged(share_image.java:236)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.sendOnTextChanged(TextView.java:7584)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.setText(TextView.java:3926)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.setText(TextView.java:3781)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.EditText.setText(EditText.java:99)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.setText(TextView.java:3756)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at com.wub.twostrangers.share_image$3.onTextChanged(share_image.java:236)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.sendOnTextChanged(TextView.java:7584)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.setText(TextView.java:3926)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.setText(TextView.java:3781)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.EditText.setText(EditText.java:99)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.setText(TextView.java:3756)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at com.wub.twostrangers.share_image$3.onTextChanged(share_image.java:236)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.sendOnTextChanged(TextView.java:7584)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.setText(TextView.java:3926)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.setText(TextView.java:3781)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.EditText.setText(EditText.java:99)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.setText(TextView.java:3756)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at com.wub.twostrangers.share_image$3.onTextChanged(share_image.java:236)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.sendOnTextChanged(TextView.java:7584)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.setText(TextView.java:3926)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.setText(TextView.java:3781)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.EditText.setText(EditText.java:99)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.setText(TextView.java:3756)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at com.wub.twostrangers.share_image$3.onTextChanged(share_image.java:236)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.sendOnTextChanged(TextView.java:7584)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.setText(TextView.java:3926)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.setText(TextView.java:3781)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.EditText.setText(EditText.java:99)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.setText(TextView.java:3756)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at com.wub.twostrangers.share_image$3.onTextChanged(share_image.java:236)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.sendOnTextChanged(TextView.java:7584)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.setText(TextView.java:3926)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.setText(TextView.java:3781)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.EditText.setText(EditText.java:99)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.setText(TextView.java:3756)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at com.wub.twostrangers.share_image$3.onTextChanged(share_image.java:236)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.sendOnTextChanged(TextView.java:7584)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.setText(TextView.java:3926)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.setText(TextView.java:3781)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.EditText.setText(EditText.java:99)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.setText(TextView.java:3756)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at com.wub.twostrangers.share_image$3.onTextChanged(share_image.java:236)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.sendOnTextChanged(TextView.java:7584)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.setText(TextView.java:3926)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.setText(TextView.java:3781)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.EditText.setText(EditText.java:99)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.setText(TextView.java:3756)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at com.wub.twostrangers.share_image$3.onTextChanged(share_image.java:236)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.sendOnTextChanged(TextView.java:7584)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.setText(TextView.java:3926)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.widget.TextView.setText(TextView.java:3781)
03-13 23:22:03.424: E/MessageQueue-JNI(19895):  at android.wid
03-13 23:22:03.424: D/AndroidRuntime(19895): Shutting down VM
03-13 23:22:03.424: W/dalvikvm(19895): threadid=1: thread exiting with uncaught exception (group=0x4132fac8)
03-13 23:22:03.434: E/AndroidRuntime(19895): FATAL EXCEPTION: main
03-13 23:22:03.434: E/AndroidRuntime(19895): java.lang.StackOverflowError
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.graphics.Paint.getTextRunAdvances(Paint.java:1754)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.graphics.Paint.getTextRunAdvances(Paint.java:1720)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.text.MeasuredText.addStyleRun(MeasuredText.java:172)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.text.MeasuredText.addStyleRun(MeasuredText.java:212)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.text.StaticLayout.generate(StaticLayout.java:325)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.text.DynamicLayout.reflow(DynamicLayout.java:284)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.text.DynamicLayout.<init>(DynamicLayout.java:170)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.makeSingleLayout(TextView.java:6314)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.makeNewLayout(TextView.java:6208)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.checkForRelayout(TextView.java:6755)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.setText(TextView.java:3923)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.setText(TextView.java:3781)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.EditText.setText(EditText.java:99)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.setText(TextView.java:3756)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at com.wub.twostrangers.share_image$3.onTextChanged(share_image.java:236)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.sendOnTextChanged(TextView.java:7584)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.setText(TextView.java:3926)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.setText(TextView.java:3781)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.EditText.setText(EditText.java:99)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.setText(TextView.java:3756)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at com.wub.twostrangers.share_image$3.onTextChanged(share_image.java:236)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.sendOnTextChanged(TextView.java:7584)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.setText(TextView.java:3926)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.setText(TextView.java:3781)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.EditText.setText(EditText.java:99)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.setText(TextView.java:3756)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at com.wub.twostrangers.share_image$3.onTextChanged(share_image.java:236)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.sendOnTextChanged(TextView.java:7584)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.setText(TextView.java:3926)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.setText(TextView.java:3781)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.EditText.setText(EditText.java:99)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.setText(TextView.java:3756)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at com.wub.twostrangers.share_image$3.onTextChanged(share_image.java:236)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.sendOnTextChanged(TextView.java:7584)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.setText(TextView.java:3926)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.setText(TextView.java:3781)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.EditText.setText(EditText.java:99)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.setText(TextView.java:3756)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at com.wub.twostrangers.share_image$3.onTextChanged(share_image.java:236)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.sendOnTextChanged(TextView.java:7584)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.setText(TextView.java:3926)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.setText(TextView.java:3781)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.EditText.setText(EditText.java:99)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.setText(TextView.java:3756)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at com.wub.twostrangers.share_image$3.onTextChanged(share_image.java:236)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.sendOnTextChanged(TextView.java:7584)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.setText(TextView.java:3926)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.setText(TextView.java:3781)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.EditText.setText(EditText.java:99)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.setText(TextView.java:3756)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at com.wub.twostrangers.share_image$3.onTextChanged(share_image.java:236)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.sendOnTextChanged(TextView.java:7584)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.setText(TextView.java:3926)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.setText(TextView.java:3781)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.EditText.setText(EditText.java:99)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.setText(TextView.java:3756)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at com.wub.twostrangers.share_image$3.onTextChanged(share_image.java:236)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.sendOnTextChanged(TextView.java:7584)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.setText(TextView.java:3926)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.setText(TextView.java:3781)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.EditText.setText(EditText.java:99)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.setText(TextView.java:3756)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at com.wub.twostrangers.share_image$3.onTextChanged(share_image.java:236)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.sendOnTextChanged(TextView.java:7584)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.setText(TextView.java:3926)
03-13 23:22:03.434: E/AndroidRuntime(19895):    at android.widget.TextView.setText(TextView.java:3

我的布局 xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

<EditText
            android:id="@+id/shared_tags"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:hint="@string/prompt_shared_tags"
            android:singleLine="true"  
            android:maxLength="70" 
            />



</RelativeLayout>

当我删除 addtextchangedlistener 时它可以工作,如果我想在我的 edittext 中写一些东西时把它放回去,它会给出这个错误

(回答后)

我编辑了我的问题,我理解了这个问题,我想为我的编辑框监听按键以检测用户按下空格,但我想在用户按下空格时立即替换,但是当我在我的编辑框中设置文本时,它将是递归的,我该如何解决?**

我该如何解决?

谢谢

【问题讨论】:

  • 请在此处发布正在使用的 xml(layout) 文件。
  • TextView.java:7600 哇,神器正在制作中。
  • 我编辑了我的问题,请看
  • 我认为问题不在于 addtextchangedlistener 。它在您的代码中的其他地方,因为 stackoverflow 错误通常由于递归而发生。你能再贴一些代码吗?
  • 最后不需要分号

标签: java android keylistener


【解决方案1】:

我通过这种方式解决了我的问题 - 修改你的 onTextChangedMethod 如下(原因如下):

@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
    String str = shared_tags.getText().toString();
    if(!str.equals(""))
        shared_tags.setText("");
    // If you want to do something else - do it here
    // Not sure if this will work to identify space - never tried it
    if(!str.contains(" ")) // if this doesn't work try KeyEvent's getAction() method 
        shared_tags.setText("Whatever you want");
}

这背后的原因有点奇怪(可能是一个bug)——当没有输入任何文本时,onTextChangedMethod() 一直在调用自己,虽然它什么也没做,但对自己的连续调用会导致堆栈溢出并抛出这个错误。无限递归是由于 onTextChanged() 方法引起的。如果你调试,你会看到这个。

编辑:在您更新的日志中,您可以看到我刚才所说的内容。您的 sendOnTextChanged() 方法被重复调用。

【讨论】:

  • 感谢回答我会尝试并很快返回
  • 对不起,问题是这样的:我想为编辑框监听键,当一个人按下空格时我想检测它并将那个字符替换为另一个,所以这将是问题,因为调用 textchanged 并调用 and打电话..
  • 是的,在您的情况下,您需要在 if 子句下方包含您的代码,它应该可以正常工作。我编辑了我的答案。
  • !str.equals(" ") 相等吗?或包含?如果我按空格,我想替换 not equalequal
  • 谢谢,如果你像这样更新你的答案,我为你打勾,答案是 if(str.contains(" ")){ //.... }
猜你喜欢
  • 1970-01-01
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
  • 2020-07-19
  • 2017-10-06
  • 2023-01-02
  • 2019-06-28
  • 2018-03-30
相关资源
最近更新 更多