2011-08-31 15 views
10

Non credo che esista, ma volevo ricontrollare. Mi piacerebbe impostare le dimensioni del testo di TextView in modo che si adatti ad una larghezza, una singola riga. Esempio:Ridimensionare il testo in una vista per adattarlo?

<LinearLayout 
    layout_width="100dip" 
    layout_height="50dip"> 

    <TextView 
    layout_width="fill_parent" 
    layout_height="wrap_content" 
    textSize="fill" 
    text="fit me please!" /> 

</LinearLayout> 

Grazie

risposta

11

È possibile utilizzare TextUtils.EllipsizeCallback. Quando il testo viene ellittizzato, questa callback viene eseguita dalla vista testo. Qui puoi impostare la dimensione del testo più piccola della corrente.

EDIT: Altrimenti si può usare TextUtils.ellipsize questo modo

while (mText != TextUtils.ellipsize(mText, textPaint, other params)) { 
    textpaint.setTextSize(textpaint.getTextSize() - 1); 
} 
+0

Interessante! – user291701

+1

Fai attenzione .. Questa è l'idea giusta, ma getTextSize() restituisce PX e setTextSize() prende DIP. Non vorrai nutrirne uno nell'altro. Tieni traccia delle dimensioni in una variabile indipendente. –

+1

Sto impostando il testo sull'oggetto paint non sulla vista testo. Quando trovo la giusta dimensione, solo allora l'ho impostato sulla vista testo. Quindi non vedo alcun problema nell'usare questa idea. – Ronnie

0

Si può sempre combinare la definizione del layout XML con Java e definire dinamicamente la dimensione del testo. Probabilmente avrai bisogno di alcuni calcoli e riferimenti dalle unità di dip alle informazioni sulla densità dei pixel sulla schermata corrente in uso, ma una volta fatto, dovrebbe quasi garantire la risoluzione del problema per tutti i casi.

+0

Ciao sì, ho scritto qualcosa per fare questo (è un po 'brutto) speravo una versione più recente dell'SDK potrebbe aver aggiunto una nuova bandiera per fare la stessa cosa. – user291701

4

Questa funzione personalizzata dovrebbe farlo, usando TextUtils.ellipsize ...

public static void shrinkTextToFit(float availableWidth, TextView textView, 
            float startingTextSize, float minimumTextSize) { 

    CharSequence text = textView.getText(); 
    float textSize = startingTextSize; 
    textView.setTextSize(startingTextSize); 
    while (text != (TextUtils.ellipsize(text, textView.getPaint(), 
             availableWidth, TextUtils.TruncateAt.END))) { 
     textSize -= 1; 
     if (textSize < minimumTextSize) { 
      break; 
     } else { 
      textView.setTextSize(textSize); 
     } 
    } 
} 
+0

Sto usando questo approccio e io 'get get' java.lang.StackOverflowError' in questo dispositivo: GT-I9192, D5803, con API 4.2.2, 4.4.4 – GuilhE

Problemi correlati