Establecer textSize programáticamente

2 minutos de lectura

avatar de usuario
Rakeeb Rajbhandari

textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, getResources().getDimension(R.dimen.result_font));

El siguiente código funciona, pero el R.dimen.result_font se toma como un valor mucho mayor de lo que realmente es. Es quizás alrededor de 18sp-22sp o 24sp según el tamaño de la pantalla … Pero el tamaño establecido aquí es al menos alrededor de 50sp. ¿Puede alguien recomendar algo?

avatar de usuario
glenn

Tienes que cambiarlo a TypedValue.COMPLEX_UNIT_PX porque getDimension(id) devuelve un valor dimen de los recursos y implícitamente convertido a píxeles.

Java:

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 
                     getResources().getDimension(R.dimen.result_font));

Kotlin:

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 
                     resources.getDimension(R.dimen.result_font))

  • ¿Por qué no usar getResources().getDimensionPixelSize() ?

    – Nizzy

    6 de agosto de 2014 a las 0:32

  • @Nizzy En realidad es lo mismo. La diferencia es el tipo de retorno. Dado que el segundo parámetro de setTextSize() requiere float valor, getDimension() es una buena elección.

    – Glenn

    6 de agosto de 2014 a las 1:14

  • ¿Qué pasa con el relleno?

    – sachithkn

    26 de mayo de 2017 a las 8:39

  • @sachithkn Los 4 parámetros de setPadding() (inicio, superior, final, inferior) también requiere valores como píxeles. getDimension() devuelto como valor de píxel. Por ejemplo, tengo un recurso 4dp con nombre small_margincuando llamo getDimension(R.dimen.small_margin) devolverá el producto de 4dp y la densidad del dispositivo (4dp * densidad). Digamos que el dispositivo es Nexus 5, su densidad es xxhdpi, el factor de escala de xxhdpi es 3, por lo que el método devolverá 4dp * 3.0.

    – Glenn

    26 de mayo de 2017 a las 11:36

Requisito

Supongamos que queremos establecer el tamaño de vista de texto mediante programación desde un archivo de recursos.

Archivo de recursos de dimensión (res/valores/dimensiones.xml)

<resources>     
   <dimen name="result_font">16sp</dimen>
</resources>

Solución

primero consigue dimensión valor del archivo de recursos en una variable “textSizeInSp”.

int textSizeInSp = (int) getResources().getDimension(R.dimen.result_font);

Siguiente conversión dieciséis sp valor en píxeles iguales.

para eso crea un método.

 public static float convertSpToPixels(float sp, Context context) {
    return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, context.getResources().getDisplayMetrics());
}

Establecemos TextSize,

textView.setTextSize(convertSpToPixels(textSizeInSp , getApplicationContext()));

Todos juntos,

int textSizeInSp = (int) getResources().getDimension(R.dimen.result_font);
textView.setTextSize(convertSpToPixels(textSizeInSp , getApplicationContext()));

¿Ha sido útil esta solución?