简体   繁体   中英

Limit EditText text length

I'm trying to do it but I get a "Stack Overflow error" so I accepted the advice and came here searching for help.

I want to limit the lenght of the text the user can insert, so when he type a character above the length limit the character is erased

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

        }

    });

Logcat:

09-25 17:07:34.972: E/AndroidRuntime(22733): FATAL EXCEPTION: main

09-25 17:07:34.972: E/AndroidRuntime(22733): java.lang.StackOverflowError 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.graphics.Paint.getTextRunAdvances(Paint.java:1754) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.graphics.Paint.getTextRunAdvances(Paint.java:1720) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.text.MeasuredText.addStyleRun(MeasuredText.java:164) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.text.MeasuredText.addStyleRun(MeasuredText.java:204) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.text.StaticLayout.generate(StaticLayout.java:281) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.text.DynamicLayout.reflow(DynamicLayout.java:284) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.text.DynamicLayout.(DynamicLayout.java:170) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.makeSingleLayout(TextView.java:5986) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.m akeNewLayout(TextView.java:5884) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.checkForRelayout(TextView.java:6423) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.setText(TextView.java:3696) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.setText(TextView.java:3554) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.EditText.setText(EditText.java:80) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.setText(TextView.java:3529) 09-25 17:07:34.972: E/AndroidRuntime(22733): at com.easyray.lemon.SmsChat$5.afterTextChanged(SmsChat.java:211) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.sendAfterTextChanged(TextView.java:7247) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.setText(TextView.java:3703) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.setText(TextView.java:3554) 09-25 17:07:34.972: E/AndroidRuntime (22733): at android.widget.EditText.setText(EditText.java:80) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.setText(TextView.java:3529) 09-25 17:07:34.972: E/AndroidRuntime(22733): at com.easyray.lemon.SmsChat$5.afterTextChanged(SmsChat.java:211) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.sendAfterTextChanged(TextView.java:7247) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.setText(TextView.java:3703) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.setText(TextView.java:3554) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.EditText.setText(EditText.java:80) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.setText(TextView.java:3529) 09-25 17:07:34.972: E/AndroidRuntime(22733): at com.easyray.lemon.SmsChat$5.afterTextChanged(SmsChat.java:211) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.sendAfterTextChanged(TextView.jav a:7247) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.setText(TextView.java:3703) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.setText(TextView.java:3554) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.EditText.setText(EditText.java:80) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.setText(TextView.java:3529) 09-25 17:07:34.972: E/AndroidRuntime(22733): at com.easyray.lemon.SmsChat$5.afterTextChanged(SmsChat.java:211) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.sendAfterTextChanged(TextView.java:7247) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.setText(TextView.java:3703) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.setText(TextView.java:3554) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.EditText.setText(EditText.java:80) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView. setText(TextView.java:3529) 09-25 17:07:34.972: E/AndroidRuntime(22733): at com.easyray.lemon.SmsChat$5.afterTextChanged(SmsChat.java:211) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.sendAfterTextChanged(TextView.java:7247) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.setText(TextView.java:3703) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.setText(TextView.java:3554) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.EditText.setText(EditText.java:80) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.setText(TextView.java:3529) 09-25 17:07:34.972: E/AndroidRuntime(22733): at com.easyray.lemon.SmsChat$5.afterTextChanged(SmsChat.java:211) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.sendAfterTextChanged(TextView.java:7247) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.setText(TextView.java:3703) 09-25 17:07:34.972: E/Andr oidRuntime(22733): at android.widget.TextView.setText(TextView.java:3554) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.EditText.setText(EditText.java:80) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.setText(TextView.java:3529) 09-25 17:07:34.972: E/AndroidRuntime(22733): at com.easyray.lemon.SmsChat$5.afterTextChanged(SmsChat.java:211) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.sendAfterTextChanged(TextView.java:7247) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.setText(TextView.java:3703) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.setText(TextView.java:3554) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.EditText.setText(EditText.java:80) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.setText(TextView.java:3529) 09-25 17:07:34.972: E/AndroidRuntime(22733): at com.easyray.lemon.SmsChat$5.afterTextChanged(SmsChat.java: 211) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.sendAfterTextChanged(TextView.java:7247) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.setText(TextView.java:3703) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.setText(TextView.java:3554) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.EditText.setText(EditText.java:80) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.setText(TextView.java:3529) 09-25 17:07:34.972: E/AndroidRuntime(22733): at com.easyray.lemon.SmsChat$5.afterTextChanged(SmsChat.java:211) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.sendAfterTextChanged(TextView.java:7247) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.setText(TextView.java:3703) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.widget.TextView.setText(TextView.java:3554) 09-25 17:07:34.972: E/AndroidRuntime(22733): at android.w

You don't want to do all these. Just try this in XML

android:maxLength="120"

When you try to enter more than 120 characters it just block you from entering the next character.

I think this is what you looking for. Just leave it if not.

This same question was already answered before for example here ( TextWatcher afterTextChanged causes stackoverflow in android )

But basically what happens is that you change the text inside the method "afterTextChanged" and that triggers the method to be called again, thus originating the infinite loop ending with the StackOverflow exception :)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM