2011-07-22 10 views
60

Parece que el official documentation no responde esto, o no puedo resolverlo.Inconsistencia al establecer el tamaño de la fuente TextView en el código y en los recursos

Elemento (no importa el AlertDialog, esto ocurre en cualquier TextView también):

TextView tv = (TextView) dialog.findViewById(android.R.id.message); 

inconsistencia. Caso A:

tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14); 
// or tv.setTextSize(14); does the same 

Caso B:

tv.setTextSize(getResources().getDimension(R.dimen.text_size_small)); 
// TypedValue makes no difference either. 

donde values/dimens.xml lo tiene:

<dimen name="text_size_small">14sp</dimen> 

Resultado: tamaño de la fuente no es la misma, y ​​parece mucho más grande cuando se recuperan a partir de recursos. Probablemente me esté perdiendo algo, ¿cuál es mi error y lo más importante? ¿Por qué?

- ACTUALIZACIÓN DE PRIMERA RESPUESTA -

El número fijo era sólo un ejemplo, ya que nadie sería duro código fijo tamaños de fuente en el código. Así que déjenme reformular la pregunta:

¿Por qué si obtengo el recurso del código, el tamaño del texto es más grande que cuando obtengo el recurso de un diseño XML? Además, la pregunta sigue siendo la misma: ¿cómo recupero una unidad de 14sp en el código y la mantengo consistente con la unidad de 14sp que está configurada en el diseño XML? No acepté la respuesta porque no me dice cómo usar las unidades sp del recurso en el código para el tamaño del texto.

En esta disposición, el tamaño de fuente es diferente, incluso si la dimensión es la misma:

<TextView 
      android:id="@+id/my_text" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      style="@style/TextBody" /> 

styles.xml:

<style name="TextBody"> 
    <item name="android:textSize">@dimen/text_size_small</item> 
    <item name="android:lineSpacingMultiplier">1.1</item> 
    <item name="android:textColor">@color/body_text_1</item> 
    <item name="android:textIsSelectable">true</item> 
    <item name="android:linksClickable">true</item> 
</style> 

Ver text_size_small allí? ¿Por qué en este caso el tamaño de la fuente es más pequeño que en el código, usando el mismo recurso dimen?

+0

Gracias por plantear esta cuestión. También lo entiendo en mi proyecto. – anticafe

Respuesta

102

Debe utilizar setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize); porque la documentación del método getDimension afirma que devuelve un Resource dimension value multiplied by the appropriate metric. que entiendo que es el valor absoluto px precalculado.

Es decir, utilizar:

tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.text_size_small)); 
+0

Gracias. Supongo que eso es lo que Nikola intentó decir (ahora que lo veo), pero tu explicación me hizo comprender la raíz del problema. – davidcesarino

2

es una cuestión de sppxdpi

tv.setTextSize(14) = 14 pixels 
+0

Eso fue solo un ejemplo ... No usaré unidades codificadas en el código. Actualicé mi pregunta para aclarar. El problema es que obtengo tamaños de letra inconsistentes a partir del mismo recurso, dependiendo de si estoy recuperando en diseño o en código. Ese es el problema que estaba tratando de resolver. – davidcesarino

22

De alguna manera esto parece encajar:

XML:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <dimen name="typo14">9sp</dimen> 
</resources> 

Java:

setTextSize(TypedValue.COMPLEX_UNIT_SP, 9); 
setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize(R.dimen.typo14)); 
+1

Gracias por su código que demuestra muy visualmente la solución. En general, esto es esencialmente lo que dijo maxmc ... usando 'setTextSize' con unidades de píxeles al recuperar de los recursos. – davidcesarino

+0

Tenía un control personalizado que tenía su 'textSize' establecido con' sp'. Cuando obtienes ese valor usando 'getDimensionPixelSize', se convierte a píxeles. Luego, cuando se establece el tamaño del texto, el valor predeterminado es 'sp' (o algo así), por lo que el tamaño era demasiado grande. Esto ayudó mucho. – JeffRegan

Cuestiones relacionadas