Obtenha dimensão do XML e defina o tamanho do texto em tempo de execução

101

Em dimens.xml, eu tenho:

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

Em tempo de execução, obtenho este valor e defino o tamanho do texto de uma visualização de texto:

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

Em um tablet de 10 ″ (1280 x 800), está tudo ok; mas em um telefone (800 x 480), a exibição de texto tem uma fonte muito grande. No tablet, o tamanho é igual a 18; no telefone, são 27.

Se eu definir o tamanho manualmente por:

textView.setTextSize(size)

o tamanho é normal em ambos os dispositivos.

Yura Shinkarev
fonte

Respostas:

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

Defina o tamanho no código:

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.text_medium));
Kostek Polônia
fonte
7
Não sei sobre o OP, mas essa era a resposta que eu procurava. Eu estava usando COMPLEX_UNIT_DP pensando que precisava especificar o tipo de entrada e não o tipo de saída.
HenryAdamsJr
quando obtenho meu tamanho de fonte (definido em um sp), obtenho 60. Quando configuro de volta com OMPLEX_UNIT_PX e recupero novamente obtenho 70. Parece que nem tudo está claro aqui
Gleichmut
2
Para o tamanho do texto, por que não posso usar TypedValue.COMPLEX_UNIT_SP?
dphans
3
@dphans O Resources.getDimension()método retorna o valor que já foi multiplicado pela métrica apropriada
pkuszewski
2
@pkuszewski Uau, isso é tão confuso.
Big_Chair
4

Ambos os métodos getDimensionPixelSize () e getDimension () usam densidade de tela para calcular pixels. A densidade da tela do seu telefone é obviamente hdpi (240dpi), então ele usa a escala de 1,5 para converter dp em sp. Matemática simples 18 * 1,5 = 27.

Parece que a densidade do seu tablet é mdpi (160 dpi), então a escala é de apenas 1: 1.

Mas se você comparar o tamanho real de ambos os textos, deve ser o mesmo.

A melhor maneira é apenas criar dois arquivos dimens.xml, um na pasta de valores para telefone e outro em valores-sw600dp para tablets (você também pode usar a pasta valores-sw720dp-land para armazenar dimensões para tablets de 10 polegadas na orientação paisagem).

Você pode ler mais sobre dimensões no Android em: http://android4beginners.com/2013/07/apêndice-c-everything-about-sizes-and-dimensions-in-android/

Android4Beginners
fonte