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

172

Je souhaite spécifier ma propre taille de texte dans mon application, mais j'ai un problème à le faire.

Lorsque je change la taille de la police dans les paramètres de l'appareil, la taille de la police de mon application TextViewchange également.

Vikasdeep Singh
la source
2
c'est le comportement par défaut que si vous modifiez la taille de police de la police native de votre appareil, cela affecte également la taille de police de votre application.
Shreyash Mahajan
vous pouvez trouver une réponse à partir d'ici stackoverflow.com/questions/16706076/…
Bhavesh Jethani
Utilisez sp pour la taille du texte… car mais il est mis à l'échelle par la préférence de taille de police de l'utilisateur. Utilisez dp pour tout le reste.
live-love

Réponses:

232

En fait, la taille de la police Paramètres affecte uniquement les tailles dans sp. Donc, tout ce que vous devez faire - définir textSizedans dpau lieu de sp, les paramètres ne changeront pas la taille du texte dans votre application.

Voici un lien vers la documentation: Dimensions

Cependant, 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 les tailles de police et certaines d'entre elles peuvent même être des utilisateurs malvoyants. L'utilisation dpau lieu de sppour le texte peut conduire à une discrimination involontaire à l'encontre de certains utilisateurs de votre application.

c'est à dire:

android:textSize="32dp"
sandrstar
la source
12
Il y a longtemps, je voulais savoir s'il y avait une règle pour quand je devrais utiliser spet quand je devais l'utiliser dp. J'ai eu une très bonne réponse ici: stackoverflow.com/questions/11638691/...
Sam
129

Le plus simple à faire est simplement d'utiliser quelque chose comme ce qui suit:

android:textSize="32sp"

Si vous souhaitez en savoir plus sur la textSizepropriété, vous pouvez consulter la documentation du développeur Android .

Evan Long
la source
1
c'est en fait pourquoi le TS a le problème, en utilisant 'sp' au lieu de 'dp'
Boy
8
Je ne sais toujours pas pourquoi il y a 100 votes positifs. parce que si nous utilisons sp pour définir la taille du texte dans l'application. Ensuite, nous changeons la taille de la police dans Setting, le TextView dans l'application change également
Phan Van Linh
comment cela répond-il à la question?
Siddarth G le
48

Utilisez le dimensiontype de ressources comme vous utilisez les stringressources ( DOCS ).

Dans votre dimens.xmlfichier, 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 dimens.xmlfichiers pour différents types d'écrans. Cela garantira l'apparence souhaitée de votre application sur différents appareils.

Lorsque vous ne spécifiez pas, android:textSizele système utilise les valeurs par défaut.

Ashakirov
la source
1
problème n'est pas des écrans. C'est la taille de police native sélectionnée dans les paramètres d'affichage Android qui conduit au problème mentionné
Himanshu Virmani
24

Notez également que si textSize est défini dans le code, l'appel textView.setTextSize(X)interprète le nombre (X) comme SP. Utilisez setTextSize(TypedValue.COMPLEX_UNIT_DIP, X)pour définir les valeurs dans dp .

Arpit
la source
13

Ce n'est pas une bonne chose d'avoir à spécifier à nouveau DIP ou SP par code lorsqu'il est déjà défini dans un fichier dimen.xml.

Je pense que la meilleure option est d'utiliser PX lors de l'utilisation d'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.

mba
la source
6

Un moyen simple d'empêcher toute l'application d'être affectée par la taille de la police du 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());
}
Usama Saeed US
la source
1

cela peut aider. ajoutez 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;
}

cependant, Resource # updateConfiguration est déplié au niveau de l'API 25, ce qui signifie qu'il ne sera plus pris en charge un jour dans le futur.

Arno_J
la source
1

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. ainsi, la modification de 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 de revoir votre application avec différentes tailles de police système (petite, normale, grande, ...)

Hossein Karami
la source
1

pour kotlin, ça marche pour moi

priceTextView.textSize = 12f
Shihab Uddin
la source
1

changer le DP en sp c'est une bonne pratique pour android android: textSize = "18sp"

Sanjay
la source
0

Si les unités utilisées sont SP, pas DP, et que vous souhaitez remplacer la mise à l'échelle des polices système, tout ce que vous faites est de remplacer une méthode dans l'activité - voir cet article .

resources.updateConfiguration est obsolète et boguée (sur Oreo, j'ai eu des problèmes avec le texte formaté).

Maxim Saplin
la source
0

Passer outre getResources() dans l'activité.

Définissez la taille de TextView dans sp comme d'habitude, comme android:textSize="32sp"

override fun getResources(): Resources {
    return super.getResources().apply {
        configuration.fontScale = 1F
        updateConfiguration(configuration, displayMetrics)
    }
}
geai
la source
0

dans Android 8, cette solution fonctionne pour moi

ajouter ce code dans l'activité de base

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(newBase);
    final Configuration override = new Configuration(newBase.getResources().getConfiguration());
    override.fontScale = 1.0f;
    applyOverrideConfiguration(override);
}

source https://stackoverflow.com/a/57225687/7985871

emad pirayesh
la source