web-dev-qa-db-fra.com

Comment attribuer une taille de texte à la valeur sp à l'aide de code Java

Si j'attribue une valeur entière pour modifier une certaine taille de texte d'un TextView à l'aide de code Java, la valeur est interprétée comme un pixel (px). Maintenant, est-ce que quelqu'un sait comment l'attribuer dans sp?

180
capecrawler
475
Santosh

Vous pouvez utiliser un objet DisplayMetrics pour faciliter la conversion entre pixels et pixels mis à l'échelle avec l'attribut scaledDensity .

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
pixelSize = (int)scaledPixelSize * dm.scaledDensity; 
35
Dave Webb

Une approche plus propre et plus réutilisable est

définir la taille du texte dans le fichier dimens.xml dans le répertoire res/values/

</resources>
   <dimen name="text_medium">14sp</dimen>
</resources>

puis appliquez-le à la TextView:

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

Basé sur le code source de setTextSize:

public void setTextSize(int unit, float size) {
    Context c = getContext();
    Resources r;

    if (c == null)
        r = Resources.getSystem();
    else
        r = c.getResources();

    setRawTextSize(TypedValue.applyDimension(
        unit, size, r.getDisplayMetrics()));
}

Je construis cette fonction pour calculer toute déformation en pixels:

int getPixels(int unit, float size) {
    DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
    return (int)TypedValue.applyDimension(unit, size, metrics);
}

Où unité est quelque chose comme TypedValue.COMPLEX_UNIT_SP.

18
rekire

Par défaut, setTextSize, sans unités fonctionnent dans SP (pixels échelonnés)

public void setTextSize (float size) 
Added in API level 1
Set the default text size to the given value, interpreted as "scaled pixel" units. This 
size is adjusted based on the current density and user font size preference.
12
Zeus Monolitics

Merci @John Leehey et @PeterH: 

desiredSp = getResources().getDimension(R.dimen.desired_sp);
density = getResources().getDisplayMetrics().density;
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, desiredSp / density);

Le fait est que si vous définissez R.dimen.desired_sp à 25 dans votre dimen.xml

  1. Sur un appareil non HD: Désirée: 25, densité = 1
  2. Sur un appareil HD (comme le Nexus 7 2e génération): Désirée devient 50, densité = 2
10
macio.Jun

Lorsque la réponse acceptée ne fonctionne pas (par exemple lorsque vous utilisez Paint), vous pouvez utiliser: 

float spTextSize = 12;
float textSize = spTextSize * getResources().getDisplayMetrics().scaledDensity;
textPaint.setTextSize(textSize);
9
pomber
semeTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 
                       context.getResources().getDimension(R.dimen.text_size_in_dp))
7
William Hu

C'est le code pour le format de conversion PX à SP .

view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);
2
Kamran Qasimov

À partir du niveau 1 de l'API, vous pouvez utiliser la méthode public void setTextSize (float size) .

De la documentation:

Définissez la taille de texte par défaut sur la valeur donnée, interprétée comme des unités de "pixels à l'échelle". Cette taille est ajustée en fonction de la densité actuelle et des préférences de taille de police de l'utilisateur.

Paramètres: taille -> float: taille de pixel mise à l'échelle.

Vous pouvez donc faire simplement:

textView.setTextSize(12); // your size in sp
0
user2342558

Après avoir essayé toutes les solutions et aucune donné des résultats acceptables (peut-être parce que je travaillais sur un périphérique avec des polices par défaut très volumineuses), voici ce qui fonctionnait pour moi (COMPLEX_UNIT_DIP = Pixels indépendants du périphérique):

textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
0
tsig