web-dev-qa-db-fra.com

Incohérence lors de la définition de la taille de la police TextView dans le code et dans les ressources

Le documentation officielle ne semble pas répondre à cela, ou je ne peux pas le comprendre.

Élément (peu importe le AlertDialog, cela se produit également sur n'importe quel TextView):

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

Incohérence. Cas A:

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

Cas B:

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

values/dimens.xml a-t-il:

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

Résultat: la taille de la police n'est pas la même et apparaît beaucoup plus grande lors de la récupération à partir de la ressource. Il me manque probablement quelque chose, alors quelle est mon erreur, et le plus important: pourquoi?

- MISE À JOUR DE LA PREMIÈRE RÉPONSE -

Le nombre fixe n'était qu'un exemple, car personne ne coderait en dur des tailles de police fixes dans le code. Permettez-moi donc de reformuler la question:

Pourquoi si j'obtiens la ressource à partir du code, la taille du texte est plus grande que lorsque j'obtiens la ressource à partir d'une disposition XML? En outre, la question est toujours la idem: comment récupérer une unité 14sp dans le code et la garder cohérente avec l'unité 14sp définie dans le XML de mise en page? Je n'ai pas accepté la réponse car elle ne me dit pas comment utiliser les unités sp de ressource dans le code pour la taille du texte.

Sur cette mise en page, la taille de police est différente, même si la dimension est la même:

<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>

Voir text_size_small là-bas? Pourquoi dans ce cas la taille de police est plus petite que dans le code, en utilisant la même ressource dimen?

62
davidcesarino

Vous devez utiliser setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize); car la documentation de la méthode getDimension indique qu'elle renvoie un Resource dimension value multiplied by the appropriate metric. que je comprends être la valeur px absolue précalculée.

Autrement dit, utilisez:

tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.text_size_small));
102
maxmc

D'une certaine manière, cela semble correspondre:

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));
24
DaRolla

C'est une question de sppxdpi

tv.setTextSize(14) = 14 pixels 
2
Nikola Despotoski