2015-07-31 12 views
7

sto usando questo metodo per ridursi TextView testo come il suo nome suggerisce:Android StackOverflow utilizzando ciclo while

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; 
} 

e sto avendo uno StackOverflow solo con questi dispositivi (e alcune volte doesn' t accada):

  • Samsung GT-I9192
  • Samsung GT-I9300
  • LG-D290

versioni del sistema operativo: 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) 

Chiamo questa funzione all'interno TextWatcherafterTextChanged() e sì che potrebbe essere il problema, ma l'idea è quella di ridurre le dimensioni del testo, mentre il suo essere inserito.

@Override 
public void afterTextChanged(Editable s) { 
    mEditText.removeTextChangedListener(mTextWatcher); 
    Utils.shrinkTextToFit("watcher", mAvailableWidth, mEditText, 50, 10); 
    mEditText.addTextChangedListener(mTextWatcher); 
} 

Esempio Logs:

Inizia a scrivere lettere (scorrere per leggere tutto il registro):

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 

Start per cancellare le lettere:

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 ========================= 

Cosa am Ho sbagliato e come posso migliorare questa soluzione per prevenire questa eccezione S?

+2

Solo un'ipotesi, ma quando modifichi il testo nel tuo metodo, questo potrebbe portare nuovamente al tuo metodo chiamato che modifica il testo, che ancora ... –

+0

@FlorianSchaetz all'interno 'afterTextChanged()' Sto facendo: 'removeTextChangedListener (mTextWatcher)', chiama la mia funzione, e quindi 'addTextChangedListener (mTextWatcher)'. Penso che ciò impedisca questa situazione, ma potrei sbagliarmi. – GuilhE

+0

aggiungi il codice per quando aggiungiTextChangedListener –

risposta

1

Ho trovato la soluzione, o così le cuciture, ed è piuttosto strano e strano. Così ho notato qualcosa di strano Wile ero Debug (perché per la prima volta ho potuto riprodurre questo errore):

ho notato quando il testo era "verde" il testo è stato essere "ben analizzato":

enter image description here enter image description here

ma alcune volte il testo non è stato "verde", specialmente se il testo è stato somenthing come ".../...":

enter image description here enter image description here


E quello stava causando il StackOverflow perché TextUtils.ellipsize non stava tornando e il debugger si comportava anche un po 'strano.

La modifica di questo:

CharSequence text = textView.getText(); 

A tal:

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

è la soluzione.
E ora funziona. Grazie a IntelliJ per essere il miglior IDE di sempre :)

1

Penso che dovresti fare i calcoli per testo, ed eseguire il setTextSize una volta.

Anche se si utilizza una sorta di vista temporanea per fare il lavoro contro, ottenere la dimensione da quella. Invece di chiamare contro la vista con l'eventlistener su di esso.

+0

Proverò questo approccio e aggiornerò il post con i risultati. Grazie ;) – GuilhE