2011-08-31 6 views
10

No creo que esto exista, pero quería verificarlo dos veces. Me gustaría establecer un tamaño de texto de TextView de manera que quepa dentro de un ancho determinado, una sola línea. Ejemplo:¿Escala el texto en una vista para caber?

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

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

</LinearLayout> 

Gracias

Respuesta

11

Puede usar el TextUtils.EllipsizeCallback. Cuando el texto se elipsó, esta devolución de llamada se realiza mediante la vista de texto. Aquí puede establecer un tamaño de texto más pequeño que el actual.

EDIT: contrario, puede utilizar TextUtils.ellipsize esta manera

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

¡Interesante! – user291701

+1

Tenga cuidado .. Esta es la idea correcta, pero getTextSize() devuelve PX y setTextSize() toma DIP. No querrás alimentar a uno con el otro. Mantenga un registro del tamaño en una variable independiente. –

+1

Estoy configurando el tamaño de texto para el objeto de pintura no para la vista de texto. Cuando encuentro el tamaño correcto, solo entonces lo configuro para la vista de texto. Entonces no veo ningún problema al usar esta idea. – Ronnie

0

Siempre se puede combinar la definición diseño xml con Java y definir dinámicamente el tamaño del texto. Es probable que necesite algunos cálculos y referencias de las unidades de inmersión a la información de densidad de píxeles sobre la pantalla actual en uso, pero una vez hecho, casi se garantiza la solución de su problema para todos los casos.

+0

Hola, sí, he escrito algo para hacer esto (es un poco feo) estaba esperando una versión más reciente del SDK puede haber agregado una nueva bandera para hacer lo mismo. – user291701

4

Esta función personalizada debe hacerlo, 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

Estoy usando este enfoque y Obtengo 'java.lang.StackOverflowError' en estos dispositivos: GT-I9192, D5803, con API 4.2.2, 4.4.4 – GuilhE

Cuestiones relacionadas