web-dev-qa-db-fra.com

La taille de la police de TextView dans l'application Android change lors de la modification de la taille de la police à partir des paramètres natifs

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.

140
VicJordan

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"
192
sandrstar

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 .

127
Evan Long

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.

43
ashakirov

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

23
Arpit

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.

12
mba

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());
}
4
Usama Saeed US

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. 

1
Arno_J

Utiliser la taille de la police dans DPs au lieu de SPs in textSize résout ce problème.

1
bpr10

Vous devez écrire dans les balises TextView en XML:

Android:textSize="32dp"
1
neha

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)
    }
}
0
jay

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é).

0
Maxim Saplin

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, ...)

0
Hossein Karami