Obtener dimensión de XML y establecer el tamaño del texto en tiempo de ejecución

En dimens.xml, tengo:

<dimen name="text_medium">18sp</dimen> 

En tiempo de ejecución, obtengo este valor y establecer el tamaño de texto de una vista de texto:

 int size = context.getResources().getDimensionPixelSize(R.dimen.text_medium); textView.setTextSize(size). 

En una tableta de 10 "(1280 x 800), todo está bien; Pero en un teléfono (800 x 480), la vista de texto tiene una fuente muy grande. En la tableta, el tamaño es igual a 18; En el teléfono, son 27.

Si configuro el tamaño manualmente mediante:

 textView.setTextSize(size) 

El tamaño es normal en ambos dispositivos.

 <dimen name="text_medium">18sp</dimen> 

Establecer el tamaño en el código:

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

Ambos métodos getDimensionPixelSize () y getDimension () utilizan la densidad de pantalla para calcular píxeles. La densidad de la pantalla del teléfono es obviamente hdpi (240dpi) por lo que utiliza la escala de 1,5 para convertir dp a sp. Matemáticas simples 18 * 1.5 = 27.

Parece que la densidad de su tableta es mdpi (160dpi) por lo que la escala es sólo 1: 1.

Pero si comparas el tamaño real de ambos textos debe ser el mismo.

La mejor manera es simplemente crear dos archivos dimens.xml uno en la carpeta de valores para el teléfono y otro en valores-sw600dp para las tabletas (también podría usar la carpeta values-sw720dp-land para almacenar las dimensiones de las tabletas de 10 pulgadas en orientación horizontal).

Puedes leer más acerca de las dimensiones en Android en: http://android4beginners.com/2013/07/appendix-c-everything-about-sizes-and-dimensions-in-android/

Puede utilizar sdp (píxeles de desnsidad escalables) https://github.com/intuit/sdp en lugar de dp, esto definitivamente salvará su vida

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.