TextView.setTextSize se comporte anormalement - comment définir dynamiquement la taille du texte de textview pour différents écrans
appeler TextView.setTextSize()
fonctionne anormalement. Juste après l'appel à setTextSize
si nous obtenons un getTextSize
son retour une valeur beaucoup plus élevée que ce que nous avons fixé à plus tôt.
voilà ce que nous faisons:
zoomControl.setOnZoomInClickListener(new OnClickListener() {
public void onClick(View view) {
float size = mViewShabad.getTextSize() + 1;
textView.setTextSize(size);
}
});
quelqu'un a déjà vu ça?
6 réponses
la différence ici est que dans la méthode setTextSize(int size)
, le type d'unité par défaut est" sp "ou"pixels gradués". Cette valeur sera une dimension de pixel différente pour chaque densité d'écran (ldpi, mdpi, hdpi).
getTextSize()
, d'autre part, 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
ce problème se produit parce que la méthode getTextSize()
renvoie la taille en pixels en fonction de la densité de l'écran ! pour obtenir le TextSize réel utiliser ceci:
DisplayMetrics metrics;
metrics = getApplicationContext().getResources().getDisplayMetrics();
float Textsize =myTextView.getTextSize()/metrics.density;
myTextView.setTextSize(Textsize+1);
j'espère qu'il le résoudre :)
si vous changez la taille de la police, quelque chose cause montrer l'erreur, vous pouvez le faire comme:"
setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15.f);
lorsque nous essayons de régler programmatiquement gettext() avec getTextSize(), renvoie la valeur dans px au lieu de sp/dp/dip et nous savons que 1sp/dp=1.5 px(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 px:sp/dp ratio puis remplacer cette valeur avec 1,5 f
means-> titleBar.setTextSize(TypedValue.COMPLEX_UNIT_SP, (getResources().getDimension(R.dimen.text_size)*your_sp_and_px_ratio_in_int f));
en bref, si vous voulez zoomer sur votre taille de texte
float size = mViewShabad.getTextSize()*1.1f;
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
parce que getTextSize () retourne UNIT_PX, alors nous devrions utiliser UNIT_PX
ajoutant un peu de saveur supplémentaire pour cette réponse, comme a également couru dans un peu de confusion. Vous devrait être en mesure de déposer ce test dans n'importe quel @RunWith(AndroidJUnit4.class)
test que vous avez dans votre projet (vous aurez également besoin d'ajouter les dimensions à vos dimensions.XML.)
Note: Tous ces essais ont réussi
@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());
}
}
la grande surprise que j'ai trouvé est que TextView.setTextSize(float)
applique la police d'échelle , donc si vous passer dans un dimen thats déjà étiqueté comme SP au lieu de DP, puis il recevra la police d'échelle deux fois .