Comment attribuer la taille du texte dans la valeur sp en utilisant le code java

Si j'attribue une valeur entière pour modifier une certaine taille de texte D'un TextView en utilisant du code java, la valeur est interprétée comme pixel (px). Maintenant, quelqu'un sait-il comment l'assigner dans sp?

175
demandé sur Hussein El Feky 2010-01-15 09:15:19

11 réponses

Http://developer.android.com/reference/android/widget/TextView.html#setTextSize%28int,%20float%29

Exemple:

textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);
458
répondu Santosh 2012-09-11 17:02:49

, Vous pouvez utiliser un DisplayMetrics objet pour aider à convertir entre les pixels et mise à l'échelle des pixels avec les scaledDensity attribut.

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
pixelSize = (int)scaledPixelSize * dm.scaledDensity; 
34
répondu Dave Webb 2010-01-15 06:42:32

Une approche plus propre et plus réutilisable est

Définir la taille du texte dans le fichier dimens.xml à l'intérieur du répertoire res/values/:

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

, puis l'appliquer à la TextView:

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, context.getResources().getDimension(R.dimen.text_medium));
23
répondu klimat 2016-09-15 10:15:10

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 caluler toute demension en pixels:

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

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

18
répondu rekire 2013-02-26 06:50:19

Par défaut setTextSize, sans unités fonctionnent dans SP (échelles pixel)

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
répondu Zeus Monolitics 2013-02-11 23:20:49

Merci @ John Leehey et @ PeterH:

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

La chose est si vous définissez R. dimen.desired_sp à 25 dans votre dimen.xml

  1. sur un périphérique non HD: desiredSp est toujours 25, Densité = 1
  2. sur appareil HD (comme Nexus 7 2ème Génération): desiredSp devient 50 ish, densité = 2
10
répondu macio.Jun 2015-03-30 15:07:37

Lorsque la réponse acceptée ne fonctionne pas (par exemple lorsqu'il s'agit de Paint), vous pouvez utiliser:

float spTextSize = 12;
float textSize = spTextSize * getResources().getDisplayMetrics().scaledDensity;
textPaint.setTextSize(textSize);
8
répondu pomber 2015-06-03 13:32:20
semeTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 
                       context.getResources().getDimension(R.dimen.text_size_in_dp))
7
répondu William Hu 2016-09-20 09:50:00

C'est le code pour le convertir PX à SP format. 100% fonctionne

view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);
2
répondu Kamran Qasimov 2017-03-14 16:53:22

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

textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
0
répondu tsig 2018-10-04 14:35:38

Dans le cas où quelqu'un cherche Kotlin way, vous pouvez faire

view.textSize = 12f
-1
répondu Nari Kim Shin 2018-05-03 23:46:57