2015-07-31 11 views
7

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 TextWatcherafterTextChanged() 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?

+2

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 ... –

+0

@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

+0

Fügen Sie den Code für addTextChangedListener hinzu –

Antwort

1

Ich habe die Lösung gefunden, oder so scheint es, und es ist ziemlich merkwürdig und seltsam. So habe ich bemerkt, etwas seltsam wile ich das Debuggen (weil zum ersten Mal, dass ich diesen Fehler reproduzieren können):

ich bemerkt habe, wenn der Text „grün“ war der Text „gut analysiert“ wurde:

enter image description here enter image description here

aber einige Male der Text nicht "grün" war, vor allem, wenn der Text somenthing wie ".../...":

enter image description here enter image description here


Und das war der StackOverflow verursacht, weil TextUtils.ellipsize nicht zurückgegeben wurde und der Debugger war auch ein bisschen seltsam.

Dies zu ändern ist:

CharSequence text = textView.getText(); 

Um dies:

CharSequence text = textView.getText().toString(); 

die Lösung.
Und jetzt funktioniert es. Danke IntelliJ für die beste IDE überhaupt :)

1

Ich denke, Sie sollten die Mathematik für textsize tun, und führen Sie Ihre setTextSize einmal.

Auch wenn Sie eine Art von temporärer Ansicht verwenden, um die Arbeit gegen zu tun, erhalten Sie die Größe von diesem. Anstatt gegen den View mit dem Eventlistener zu telefonieren.

+0

Ich werde diesen Ansatz versuchen und den Beitrag mit den Ergebnissen aktualisieren. Vielen Dank ;) – GuilhE