I use this method to compress TextView text, as the name suggests:
public static float shrinkTextToFit(String caller, float availableWidth, TextView textView, float startingTextSize, float minimumTextSize) { startingTextSize = textView.getTextSize() < startingTextSize ? textView.getTextSize() : startingTextSize; Log.i("123", "========================="); Log.i("123", caller + " called shrinkTextToFit"); CharSequence text = textView.getText(); float textSize = startingTextSize; textView.setTextSize(startingTextSize); while (!TextUtils.equals(text, (TextUtils.ellipsize(text, textView.getPaint(), availableWidth, TextUtils.TruncateAt.END)))) { textSize -= 2; Log.i("123", "textSize: " + textSize); if ((textSize <= minimumTextSize) || (textSize <= 0)) { break; } else { textView.setTextSize(textSize); } } return textSize; }
And I have a stack overflow only with these devices (and sometimes this does not happen):
- Samsung GT-I9192
- Samsung GT-I9300
- LG-D290
OS version: 4.4.2, 4.3
10 at android.widget.TextView.sendAfterTextChanged(TextView.java:8503) 11 at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:10633) 12 at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:970) 13 at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:497) 14 at android.text.SpannableStringBuilder.append(SpannableStringBuilder.java:247) 15 at android.text.TextUtils.ellipsize(TextUtils.java:1185) 16 at android.text.TextUtils.ellipsize(TextUtils.java:1079) 17 at android.text.TextUtils.ellipsize(TextUtils.java:1054) 18 at app.utils.Utils.float shrinkTextToFit(float,android.widget.TextView,float,float)
I call this function inside TextWatcher afterTextChanged() , and yes, this may be a problem, but the idea is to reduce the size of the text when inserting it.
@Override public void afterTextChanged(Editable s) { mEditText.removeTextChangedListener(mTextWatcher); Utils.shrinkTextToFit("watcher", mAvailableWidth, mEditText, 50, 10); mEditText.addTextChangedListener(mTextWatcher); }
Examples of magazines:
Start typing letters (scroll to read the entire journal):
08-01 14:48:50.284 watcher called shrinkTextToFit 08-01 14:48:50.676
Start erasing the letters:
08-01 14:48:59.953
What am I doing wrong and how can I improve this solution to prevent this exception?
java android stack-overflow while-loop textwatcher
GuilhE
source share