ich mit dieser Methode TextView
Text schrumpfen, wie der Name schon suggeriert:Android Stackoverflow mit while-Schleife
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;
}
und ich bin ein Stackoverflow nur mit diesen Geräten mit (und einige Male es doesn‘ t passieren):
- Samsung GT-I9192
- Samsung GT-I9300
- LG-D290
OS-Versionen: 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)
Ich rufe diese Funktion innerhalb TextWatcher
afterTextChanged()
und ja, das könnte das Problem sein, aber die Idee ist die Textgröße zu schrumpfen, während sein eingeführt wird.
@Override
public void afterTextChanged(Editable s) {
mEditText.removeTextChangedListener(mTextWatcher);
Utils.shrinkTextToFit("watcher", mAvailableWidth, mEditText, 50, 10);
mEditText.addTextChangedListener(mTextWatcher);
}
Beispiel Protokolle:
Anfangsbuchstaben eingeben (scrollen alle das Protokoll zu lesen):
08-01 14:48:50.284 watcher called shrinkTextToFit
08-01 14:48:50.676 =========================
08-01 14:48:50.677 watcher called shrinkTextToFit
08-01 14:48:51.749 =========================
08-01 14:48:51.749 watcher called shrinkTextToFit
08-01 14:48:51.749 textSize: 48.0
08-01 14:48:51.750 textSize: 46.0
08-01 14:48:51.751 textSize: 44.0
08-01 14:48:51.752 textSize: 42.0
08-01 14:48:52.500 =========================
08-01 14:48:52.501 watcher called shrinkTextToFit
08-01 14:48:52.501 textSize: 48.0
08-01 14:48:52.501 textSize: 46.0
08-01 14:48:52.501 textSize: 44.0
08-01 14:48:52.501 textSize: 42.0
08-01 14:48:52.501 textSize: 40.0
08-01 14:48:52.503 textSize: 38.0
08-01 14:48:52.504 textSize: 36.0
08-01 14:48:53.013 =========================
08-01 14:48:53.013 watcher called shrinkTextToFit
08-01 14:48:53.013 textSize: 48.0
08-01 14:48:53.013 textSize: 46.0
08-01 14:48:53.013 textSize: 44.0
08-01 14:48:53.014 textSize: 42.0
08-01 14:48:53.015 textSize: 40.0
08-01 14:48:53.015 textSize: 38.0
08-01 14:48:53.015 textSize: 36.0
08-01 14:48:53.016 textSize: 34.0
08-01 14:48:53.017 textSize: 32.0
08-01 14:48:53.020 textSize: 30.0
08-01 14:48:59.948 =========================
08-01 14:48:59.949 watcher called shrinkTextToFit
08-01 14:48:59.949 textSize: 48.0
08-01 14:48:59.949 textSize: 46.0
08-01 14:48:59.949 textSize: 44.0
08-01 14:48:59.949 textSize: 42.0
08-01 14:48:59.950 textSize: 40.0
08-01 14:48:59.950 textSize: 38.0
08-01 14:48:59.950 textSize: 36.0
08-01 14:48:59.950 textSize: 34.0
08-01 14:48:59.951 textSize: 32.0
08-01 14:48:59.951 textSize: 30.0
08-01 14:48:59.951 textSize: 28.0
Anfangsbuchstaben zu löschen:
08-01 14:48:59.953 =========================
08-01 14:48:59.953 watcher called shrinkTextToFit
08-01 14:48:59.954 textSize: 48.0
08-01 14:48:59.954 textSize: 46.0
08-01 14:48:59.954 textSize: 44.0
08-01 14:48:59.954 textSize: 42.0
08-01 14:48:59.954 textSize: 40.0
08-01 14:48:59.954 textSize: 38.0
08-01 14:48:59.954 textSize: 36.0
08-01 14:48:59.954 textSize: 34.0
08-01 14:48:59.954 textSize: 32.0
08-01 14:48:59.954 textSize: 30.0
08-01 14:49:00.116 =========================
08-01 14:49:00.116 watcher called shrinkTextToFit
08-01 14:49:00.116 textSize: 48.0
08-01 14:49:00.117 textSize: 46.0
08-01 14:49:00.117 textSize: 44.0
08-01 14:49:00.117 textSize: 42.0
08-01 14:49:00.117 textSize: 40.0
08-01 14:49:00.117 textSize: 38.0
08-01 14:49:00.117 textSize: 36.0
08-01 14:49:00.121 =========================
08-01 14:49:00.121 watcher called shrinkTextToFit
08-01 14:49:00.121 textSize: 48.0
08-01 14:49:00.121 textSize: 46.0
08-01 14:49:00.121 textSize: 44.0
08-01 14:49:00.121 textSize: 42.0
08-01 14:49:00.284 =========================
08-01 14:49:00.284 watcher called shrinkTextToFit
08-01 14:49:00.288 =========================
08-01 14:49:00.288 watcher called shrinkTextToFit
08-01 14:49:00.444 =========================
Was bin Ich mache falsch und wie kann ich diese Lösung verbessern, um diese Ausnahme zu verhindern s?
Nur eine Vermutung, aber wenn Sie den Text in Ihrer Methode ändern, könnte dies wiederum dazu führen, dass Ihre Methode aufgerufen wird, die dann den Text ändert, der wiederum ... –
@FlorianSchaetz drinnen 'afterTextChanged()' Ich mache: 'removeTextChangedListener (mTextWatcher)', rufe meine Funktion auf und dann 'addTextChangedListener (mTextWatcher)' '. Ich denke, das verhindert diese Situation, aber ich könnte falsch liegen. – GuilhE
Fügen Sie den Code für addTextChangedListener hinzu –