Android 限制编辑文本长度

Android 限制编辑文本长度,android,android-edittext,Android,Android Edittext,我正试图这样做,但我得到了堆栈溢出错误,所以我接受了建议,来到这里寻求帮助 我想限制用户可以插入的文本的长度,因此当用户键入长度限制以上的字符时,该字符将被删除 sms_input.addTextChangedListener(new TextWatcher(){ @Override public void afterTextChanged(Editable s) { String cs = sms_input.getText().to

我正试图这样做,但我得到了堆栈溢出错误,所以我接受了建议,来到这里寻求帮助

我想限制用户可以插入的文本的长度,因此当用户键入长度限制以上的字符时,该字符将被删除

sms_input.addTextChangedListener(new TextWatcher(){

        @Override
        public void afterTextChanged(Editable s) {

            String cs = sms_input.getText().toString();
            if (cs.length() > 160) { sms_input.setText(cs.substring(0, MAX_MSG_LENGTH + 1)); }

        }

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

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            // TODO Auto-generated method stub

        }

    });
日志:

09-25 17:07:34.972: E/AndroidRuntime(22733): FATAL EXCEPTION: main
09-25 17:07:34.972:E/AndroidRuntime22733:java.lang.StackOverflower错误 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.graphics.Paint.getExtranuAdvancesPaint.java:1754 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.graphics.Paint.getExtranuAdvancesPaint.java:1720 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.text.MeasuredText.addStyleRunMeasuredText.java:164 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.text.MeasuredText.addStyleRunMeasuredText.java:204 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.text.StaticLayout.generateStaticLayout.java:281 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.text.dynamiclayot.reflowdynamiclayot.java:284 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.text.DynamicLayout.DynamicLayout.java:170 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.makeSingleLayoutTextView.java:5986 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.MakeNewLayoutExtView.java:5884 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.checkForRelayoutTextView.java:6423 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.setTextTextView.java:3696 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.setTextTextView.java:3554 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.EditText.setTextEditText.java:80 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.settextextextview.java:3529 09-25 17:07:34.972:E/AndroidRuntime22733:com.easyray.lemon.SmsChat$5.PostextChangedMschat.java:211 09-25 17:07:34.972:E/AndroidRuntime22733:at android.widget.TextView.sendAfterTextChangedTextView.java:7247 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.setTextTextView.java:3703 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.setTextTextView.java:3554 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.EditText.setTextEditText.java:80 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.settextextextview.java:3529 09-25 17:07:34.972:E/AndroidRuntime22733:com.easyray.lemon.SmsChat$5.PostextChangedMschat.java:211 09-25 17:07:34.972:E/AndroidRuntime22733:at android.widget.TextView.sendAfterTextChangedTextView.java:7247 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.setTextTextView.java:3703 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.setTextTextView.java:3554 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.EditText.setTextEditText.java:80 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.settextextextview.java:3529 09-25 17:07:34.972:E/AndroidRuntime22733:com.easyray.lemon.SmsChat$5.PostextChangedMschat.java:211 09-25 17:07:34.972:E/AndroidRuntime22733:at android.widget.TextView.sendAfterTextChangedTextView.java:7247 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.setTextTextView.java:3703 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.setTextTextView.java:3554 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.EditText.setTextEditText.java:80 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.settextextextview.java:3529 09-25 17:07:34.972:E/AndroidRuntime22733:com.easyray.lemon.SmsChat$5.PostextChangedMschat.java:211 09-25 17:07:34.972:E/AndroidRuntime22733:at android.widget.TextView.sendAfterTextChangedTextView.java:7247 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.setTextTextView.java:3703 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.setTextTextView.java:3554 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.EditText.setTextEditText.java:80 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.settextextextview.java:3529 09-25 17:07:34.972:E/AndroidRuntime22733:com.easyray.lemon.SmsChat$5.PostextChangedMschat.java:211 09-25 17:07:34.972:E/AndroidRuntime22733:at android.widget.TextView.sendAfterTextChangedTextView.java:7247 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.setTextTextView.java:3703 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.setTextTextView.java:3554 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.EditText.setTextEditText.java:80 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.settextextextview.java:3529 09-25 17:07:34.972:E/AndroidRuntime22733:com.easyray.lemon.SmsChat$5.0 java:211 09-25 17:07:34.972:E/AndroidRuntime22733:at android.widget.TextView.sendAfterTextChangedTextView.java:7247 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.setTextTextView.java:3703 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.setTextTextView.java:3554 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.EditText.setTextEditText.java:80 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.settextextextview.java:3529 09-25 17:07:34.972:E/AndroidRuntime22733:com.easyray.lemon.SmsChat$5.PostextChangedMschat.java:211 09-25 17:07:34.972:E/AndroidRuntime22733:at android.widget.TextView.sendAfterTextChangedTextView.java:7247 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.setTextTextView.java:3703 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.setTextTextView.java:3554 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.EditText.setTextEditText.java:80 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.settextextextview.java:3529 09-25 17:07:34.972:E/AndroidRuntime22733:com.easyray.lemon.SmsChat$5.PostextChangedMschat.java:211 09-25 17:07:34.972:E/AndroidRuntime22733:at android.widget.TextView.sendAfterTextChangedTextView.java:7247 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.setTextTextView.java:3703 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.setTextTextView.java:3554 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.EditText.setTextEditText.java:80 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.settextextextview.java:3529 09-25 17:07:34.972:E/AndroidRuntime22733:com.easyray.lemon.SmsChat$5.PostextChangedMschat.java:211 09-25 17:07:34.972:E/AndroidRuntime22733:at android.widget.TextView.sendAfterTextChangedTextView.java:7247 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.setTextTextView.java:3703 09-25 17:07:34.972:E/AndroidRuntime22733:at-android.widget.TextView.setTextTextView.java:3554
09-25 17:07:34.972:E/AndroidRuntime22733:at android.w

同样的问题之前已经得到了回答,例如这里


但基本上发生的情况是,您在方法afterTextChanged中更改了文本,并触发再次调用该方法,从而引发以StackOverflow异常结尾的无限循环:

您不想做所有这些。在XML中试试这个

android:maxLength="120"
当您尝试输入超过120个字符时,它只会阻止您输入下一个字符


我想这就是你要找的。如果没有,请留下它。

您能描述一下您的问题以及代码吗?完成后,我一定是意外删除了它。您遇到了什么错误?堆栈溢出错误?真正地我们能看看你的日志吗?完成了,但我不能正确地发布日志,抱歉,没问题。我对它进行了编辑,使它更具可读性。检查下面的答案。至少现在你知道为什么会发生了。首先,感谢你给出了很好的解释。我想知道如何解决这个问题。如果对小于maxLength的1进行检查,并且当发现已达到该值时,该怎么办,setText方法将设置仍然小于maxLength的字符串,然后禁用EditText,还可能删除与其关联的TextWatcher?一种可能的解决方案是使用removeTextChangedListener删除watcher,设置文本,然后再次添加侦听器。是否有其他方法获得相同的效果?也许这种方法是错误的。如果我可以让textwatcher不调用ContextChanged,如果长度>最大长度,那将非常有用。为什么不使用InputFilter.LengthFilter160?长过滤器是甜的!我希望我能再次投票支持你的答案!