Obtenir une dimension à partir de XML et définir la taille du texte au moment de l'exécution

101

Dans dimens.xml, j'ai:

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

Au moment de l'exécution, j'obtiens cette valeur et définit la taille du texte d'une vue de texte:

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

Sur une tablette de 10 pouces (1280 x 800), tout va bien; mais sur un téléphone (800 x 480), la vue texte a une très grande police. Sur la tablette, la taille est égale à 18; au téléphone, il est 27.

Si je règle la taille manuellement par:

textView.setTextSize(size)

la taille est normale sur les deux appareils.

Yura Shinkarev
la source

Réponses:

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

Définissez la taille dans le code:

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.text_medium));
Kostek Pologne
la source
7
Je ne sais pas pour l'OP, mais c'était la réponse que je cherchais. J'utilisais COMPLEX_UNIT_DP en pensant que je devais spécifier le type d'entrée et non le type de sortie.
HenryAdamsJr
quand j'obtiens ma taille de police (définie dans un sp) j'obtiens 60. Quand je la remets avec OMPLEX_UNIT_PX et que je la récupère à nouveau, j'obtiens 70. Il semble que tout n'est pas clair ici
Gleichmut
2
Pour la taille du texte, pourquoi ne puis-je pas utiliser à la TypedValue.COMPLEX_UNIT_SPplace?
dphelins
3
@dphans La Resources.getDimension()méthode renvoie la valeur qui est déjà multipliée par la métrique appropriée
pkuszewski
2
@pkuszewski Wow, c'est tellement déroutant.
Big_Chair
4

Les deux méthodes getDimensionPixelSize () et getDimension () utilisent la densité d'écran pour calculer les pixels. La densité de l'écran de votre téléphone est évidemment hdpi (240 dpi), il utilise donc une échelle de 1,5 pour convertir dp en sp. Mathématiques simples 18 * 1,5 = 27.

Il semble que la densité de votre tablette soit mdpi (160 dpi), donc l'échelle n'est que de 1: 1.

Mais si vous comparez la taille réelle des deux textes, cela devrait être le même.

Le meilleur moyen consiste simplement à créer deux fichiers dimens.xml, un dans le dossier values ​​pour le téléphone et un autre dans values-sw600dp pour les tablettes (vous pouvez également utiliser le dossier values-sw720dp-land pour stocker les dimensions des tablettes 10 pouces en orientation paysage).

Vous pouvez en savoir plus sur les dimensions dans Android à l' adresse : http://android4beginners.com/2013/07/appendix-c-everything-about-sizes-and-dimensions-in-android/

Android4Beginners
la source