web-dev-qa-db-fra.com

TextView.setTextSize se comporte anormalement - Comment définir la taille du texte de textview de manière dynamique pour différents écrans

L'appel de TextView.setTextSize() fonctionne anormalement. Juste après l'appel à setTextSize si nous obtenons une getTextSize, sa valeur renvoyée est beaucoup plus élevée que celle définie précédemment 

Voici ce que nous faisons:

zoomControl.setOnZoomInClickListener(new OnClickListener() {
    public void onClick(View view) {
        float size = mViewShabad.getTextSize() + 1;
        textView.setTextSize(size);
    }
});

Quelqu'un a-t-il déjà vu cela avant?

108
singhspk

La différence ici est que dans la méthode setTextSize(int size), le type d'unité est par défaut "sp" ou "pixels redimensionnés". Cette valeur sera une dimension de pixel différente pour chaque densité d'écran (ldpi, mdpi, hdpi). 

getTextSize(), en revanche, renvoie les dimensions réelles en pixels du texte.

Vous pouvez utiliser setTextSize(int unit, float size) pour spécifier un type d'unité. Les valeurs constantes pour cela peuvent être trouvées dans la classe TypedValue, mais certaines d'entre elles sont:

TypedValue.COMPLEX_UNIT_PX   //Pixels

TypedValue.COMPLEX_UNIT_SP   //Scaled Pixels

TypedValue.COMPLEX_UNIT_DIP  //Device Independent Pixels
339
kcoppock

ce problème est dû au fait que la méthode getTextSize() renvoie la taille en pixels de la densité de l'écran Pour obtenir la taille réelle du texte, utilisez ceci:

DisplayMetrics metrics;
metrics = getApplicationContext().getResources().getDisplayMetrics();
float Textsize =myTextView.getTextSize()/metrics.density;
myTextView.setTextSize(Textsize+1);

j'espère que ça résoudra :)

15
M_AWADI

si vous définissez le paramètre, changez la taille de la police (quelque chose qui cause une erreur d’affichage), vous pouvez procéder comme suit:

setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15.f);
7
hui 谁与争辉

Lorsque nous essayons de définir un problème de programmation avec getTextSize (), setText () renvoie la valeur en px au lieu de sp/dp/dip et nous savons que 1sp/dp = 1,5px (taille de l'écran = 240).

 titleBar.setTextSize(TypedValue.COMPLEX_UNIT_SP, (getResources().getDimension(R.dimen.text_size)*1.5f)); 

fonctionne parfaitement pour moi ou nous pouvons utiliser displaymatrix to px: sp/dp puis remplacer cette valeur par 1.5f

means-> titleBar.setTextSize(TypedValue.COMPLEX_UNIT_SP, (getResources().getDimension(R.dimen.text_size)*your_sp_and_px_ratio_in_int f));
4
ranjan

En bref, si vous voulez faire un zoom arrière sur votre taille de texte

float size = mViewShabad.getTextSize()*1.1f;
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);

Étant donné que getTextSize () renvoie UNIT_PX, nous devrions utiliser UNIT_PX.

2
Frank Nguyen

Ajouter un peu plus de saveur à cette réponse a également semé la confusion. Vous devriez pouvez insérer ce test dans n’importe quel test @RunWith(AndroidJUnit4.class) que vous avez dans votre projet (vous devrez également ajouter les dimensions à votre fichier dimens.xml).

Note: Tous ces tests réussissent

@Test public void testScaledFontSizes() {
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
    final Context context = InstrumentationRegistry.getTargetContext();

    Configuration configuration = context.getResources().getConfiguration();
    configuration.fontScale = 2.0f;
    configuration.densityDpi = 160; // mdpi, 1:1
    context.getResources().updateConfiguration(configuration, null);

    float scaledTextSize = context.getResources().getDimensionPixelSize(R.dimen.sp_15);
    assertEquals(30.0f, scaledTextSize);

    // Create a new TextView with the explicitly set configuration
    TextView textView = new TextView(context);
    textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, scaledTextSize);

    // 30, because font size is scaled
    assertEquals(30.0f, textView.getTextSize());

    // This is what we *don't* want, it's scaled *twice*!
    textView.setTextSize(scaledTextSize);
    assertEquals(60.0f, textView.getTextSize());

    // DP instead of SP tests
    float fifteenDp = context.getResources().getDimensionPixelSize(R.dimen.dp_15);
    assertEquals(15.0f, fifteenDp);

    textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, fifteenDp);
    // Still 15, because it's DP, not SP
    assertEquals(15.0f, fifteenDp);

    textView.setTextSize(fifteenDp);
    // 30, because setTextSize DOES font scaling
    assertEquals(30.0f, textView.getTextSize());
  }
}

Le grand avantage que j’ai trouvé est que TextView.setTextSize(float) applique l’échelle de police , donc si vous transmettez une dimension déjà appelée SP au lieu de DP, elle recevra la police d’échelle deux fois .

0
Kevin Grant

Après longtemps frappé et finalement résolu comme ça

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
          getResources().getDimension(R.dimen.textsize));

créer un dossier dimen comme ceci: res/values ​​/ dimensions.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

 <dimen name="textsize">8sp</dimen>

 </resources>
0
NagarjunaReddy