Je souhaite spécifier ma propre taille de texte dans mon application, mais cela me pose un problème.
Lorsque je modifie la taille de la police dans les paramètres du périphérique, la taille de la police de mon application TextView
change également.
En fait, la taille de la police de paramètres n’affecte que les tailles dans sp
. Donc tout ce que vous devez faire - définissez textSize
dans dp
au lieu de sp
, les paramètres ne changeront pas la taille du texte dans votre application.
Voici un lien vers la documentation: Dimensions
Toutefois, veuillez noter que le comportement attendu est que les polices de toutes les applications respectent les préférences de l'utilisateur. Il existe de nombreuses raisons pour lesquelles un utilisateur peut souhaiter ajuster la taille des polices et certaines d'entre elles peuvent même être des utilisateurs malvoyants. Utiliser dp
au lieu de sp
pour le texte peut conduire à discriminer à contrecoeur certains utilisateurs de votre application.
c'est à dire:
Android:textSize="32dp"
Le plus simple consiste simplement à utiliser les éléments suivants:
Android:textSize="32sp"
Si vous souhaitez en savoir plus sur la propriété textSize
, vous pouvez consulter la documentation pour les développeurs Android .
Utilisez le type de ressources dimension
comme vous utilisiez les ressources string
( DOCS ).
Dans votre fichier dimens.xml
, déclarez vos variables de dimension:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="textview_height">25dp</dimen>
<dimen name="textview_width">150dp</dimen>
<dimen name="ball_radius">30dp</dimen>
<dimen name="font_size">16sp</dimen>
</resources>
Ensuite, vous pouvez utiliser ces valeurs comme ceci:
<TextView
Android:layout_height="@dimen/textview_height"
Android:layout_width="@dimen/textview_width"
Android:textSize="@dimen/font_size"/>
Vous pouvez déclarer différents fichiers dimens.xml
pour différents types d'écran ..__ Cela garantira l'apparence souhaitée de votre application sur différents appareils.
Lorsque vous ne spécifiez pas Android:textSize
, le système utilise les valeurs par défaut.
Notez également que si textSize est défini dans le code, l'appel de textView.setTextSize(X)
interprète le nombre (X) en tant que SP. Utilisez setTextSize(TypedValue.COMPLEX_UNIT_DIP, X)
pour définir les valeurs dans dp .
Ce n’est pas une bonne chose d’avoir à spécifier DIP ou SP à nouveau par code s’ils sont déjà définis dans un fichier dimen.xml.
Je pense que la meilleure option consiste à utiliser PX avec une valeur dimen.xml:
tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize(R.dimen.txt_size));
De cette façon, vous pouvez passer de DP à SP si nécessaire dans le fichier dimen.xml sans avoir à changer de code.
un moyen simple d'éviter que l'application entière ne soit affectée par la taille de police système consiste à mettre à jour la configuration à l'aide d'une activité de base.
//in base activity add this code.
public void adjustFontScale( Configuration configuration) {
configuration.fontScale = (float) 1.0;
DisplayMetrics metrics = getResources().getDisplayMetrics();
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.getDefaultDisplay().getMetrics(metrics);
metrics.scaledDensity = configuration.fontScale * metrics.density;
getBaseContext().getResources().updateConfiguration(configuration, metrics);
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
adjustFontScale( getResources().getConfiguration());
}
cela peut aider. ajouter le code dans votre application personnalisée ou BaseActivity
/**
* 重写 getResource 方法,防止系统字体影响
*
* @return
*/
@Override
public Resources getResources() {
Resources resources = super.getResources();
if (resources != null && resources.getConfiguration().fontScale != 1) {
Configuration configuration = resources.getConfiguration();
configuration.fontScale = 1;
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
}
return resources;
}
toutefois, Resource # updateConfiguration est déployé dans l'API de niveau 25, ce qui signifie qu'elle ne sera plus prise en charge un jour ou l'autre.
Utiliser la taille de la police dans DPs au lieu de SPs in textSize
résout ce problème.
Vous devez écrire dans les balises TextView en XML:
Android:textSize="32dp"
Remplacer getResources()
dans Activité.
Définissez la taille de TextView en sp, comme d'habitude, comme Android:textSize="32sp"
override fun getResources(): Resources {
return super.getResources().apply {
configuration.fontScale = 1F
updateConfiguration(configuration, displayMetrics)
}
}
Si les unités utilisées sont SP, et non DP, et que vous souhaitez remplacer la mise à l'échelle des polices système, il vous suffit de remplacer une méthode de activity - voir cet article .
resources.updateConfiguration est obsolète et défectueux (sur Oreo, j'avais des problèmes avec le texte formaté).
Vous pouvez utiliser ce code:
Android:textSize="32dp"
cela résout votre problème, mais vous devez savoir que vous devez respecter les décisions des utilisateurs ., changer la taille du texte à partir des paramètres de l'appareil ne changera pas cette valeur. c'est pourquoi vous devez utiliser sp au lieu de dp . Ma suggestion est donc d'examiner votre application avec différentes tailles de police système (petite, normale, grande, ...)