Redimensionner automatiquement les TextViews

Sous Android 8.0 (niveau d'API 26) ou version ultérieure, vous pouvez demander à une TextView de laisser la taille du texte se développer ou se réduire automatiquement pour remplir sa mise en page en fonction des caractéristiques et des limites de la TextView. Ce paramètre permet d'optimiser plus facilement la taille du texte sur différents écrans avec du contenu dynamique.

La bibliothèque Support 26.0 est entièrement compatible avec la fonctionnalité de dimensionnement automatique TextView sur les appareils équipés d'Android 8.0 (niveau d'API 26) ou version antérieure. Le package android.support.v4.widget contient la classe TextViewCompat pour accéder aux fonctionnalités d'une manière rétrocompatible.

Configurer le redimensionnement automatique de TextView

Vous pouvez utiliser le framework ou la bibliothèque Support pour configurer le dimensionnement automatique de TextView par programmation ou au format XML. Pour définir les attributs XML, vous pouvez également utiliser la fenêtre Properties (Propriétés) d'Android Studio.

Trois options s'offrent à vous pour configurer le dimensionnement automatique de TextView, qui sont décrites dans les sections suivantes:

Remarque: Si vous définissez le dimensionnement automatique dans un fichier XML, nous vous déconseillons d'utiliser la valeur "wrap_content" pour les attributs layout_width ou layout_height d'une TextView. Cela pourrait produire des résultats inattendus.

Par défaut

Le paramètre par défaut permet le dimensionnement automatique de TextView de manière uniforme sur les axes horizontal et vertical.

  • Pour définir le paramètre par défaut de manière programmatique, appelez la méthode setAutoSizeTextTypeWithDefaults(int autoSizeTextType) . Fournissez AUTO_SIZE_TEXT_TYPE_NONE pour désactiver la fonctionnalité de dimensionnement automatique, ou AUTO_SIZE_TEXT_TYPE_UNIFORM pour mettre à l'échelle les axes horizontal et vertical de manière uniforme.
  • Remarque: Les dimensions par défaut pour la mise à l'échelle uniforme sont minTextSize = 12sp, maxTextSize = 112sp et granularity = 1px..

  • Pour définir le paramètre par défaut en XML, utilisez l'espace de noms android et définissez l'attribut autoSizeTextType sur none ou uniform.
  • <?xml version="1.0" encoding="utf-8"?>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:autoSizeTextType="uniform" />
    

Définir le paramètre par défaut à l'aide de la bibliothèque Support

  • Pour définir le paramètre par défaut de manière automatisée via la bibliothèque Support, appelez la méthode TextViewCompat.setAutoSizeTextTypeWithDefaults(TextView textview, int autoSizeTextType). Fournissez une instance du widget TextView et l'un des types de texte, tels que TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE ou TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM.
  • Pour définir le paramètre par défaut en XML via la bibliothèque Support, utilisez l'espace de noms app et définissez l'attribut autoSizeTextType sur none ou uniform.
  • <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
      <TextView
          android:layout_width="match_parent"
          android:layout_height="200dp"
          app:autoSizeTextType="uniform" />
    
    </LinearLayout>
    

Niveau de précision

Vous pouvez définir une plage de tailles de texte minimales et maximales, ainsi qu'une dimension spécifiant la taille de chaque étape. TextView s'adapte de manière uniforme dans une plage comprise entre les attributs de taille minimale et maximale. Chaque incrément se produit en tant que taille de pas définie dans l'attribut de granularité.

  • Pour définir une plage de tailles de texte et une dimension de manière programmatique, appelez la méthode setAutoSizeTextTypeUniformWithConfiguration(int autoSizeMinTextSize, int autoSizeMaxTextSize, int autoSizeStepGranularity, int unit). Indiquez la valeur maximale, la valeur minimale, la valeur de précision et n'importe quelle unité de dimension TypedValue.
  • Pour définir une plage de tailles de texte et une dimension en XML, utilisez l'espace de noms android et définissez les attributs suivants :
    • Définissez l'attribut autoSizeTextType sur none ou uniform. La valeur none est la valeur par défaut, et uniform permet à TextView d'effectuer une mise à l'échelle uniforme sur l'axe horizontal et l'axe vertical.
    • Définissez les attributs autoSizeMinTextSize, autoSizeMaxTextSize et autoSizeStepGranularity pour définir les dimensions de dimensionnement automatique de TextView.
  • <?xml version="1.0" encoding="utf-8"?>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:autoSizeTextType="uniform"
        android:autoSizeMinTextSize="12sp"
        android:autoSizeMaxTextSize="100sp"
        android:autoSizeStepGranularity="2sp" />
    

Définir la précision à l'aide de la bibliothèque Support

  • Pour définir une plage de tailles de texte et une dimension de manière programmatique via la bibliothèque Support, appelez la méthode TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(int autoSizeMinTextSize, int autoSizeMaxTextSize, int autoSizeStepGranularity, int unit). Indiquez la valeur maximale, la valeur minimale, la valeur de précision et n'importe quelle unité de dimension TypedValue.
  • Pour définir une plage de tailles de texte et une dimension en XML via la bibliothèque Support, utilisez l'espace de noms app et définissez les attributs autoSizeText, autoSizeMinTextSize, autoSizeMaxTextSize et autoSizeStepGranularity dans le fichier XML de mise en page.
  • <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
      <TextView
          android:layout_width="match_parent"
          android:layout_height="200dp"
          app:autoSizeTextType="uniform"
          app:autoSizeMinTextSize="12sp"
          app:autoSizeMaxTextSize="100sp"
          app:autoSizeStepGranularity="2sp" />
    
    </LinearLayout>
    

Tailles prédéfinies

Les tailles prédéfinies vous permettent de spécifier les valeurs sélectionnées par TextView lors du redimensionnement automatique du texte.

  • Pour utiliser des tailles prédéfinies afin de configurer le dimensionnement automatique de TextView de manière programmatique, appelez la méthode setAutoSizeTextTypeUniformWithPresetSizes(int[] presetSizes, int unit). Fournissez un tableau des tailles et n'importe quelle unité de dimension TypedValue pour la taille.
  • Pour configurer le dimensionnement automatique de TextView en XML à l'aide de tailles prédéfinies, utilisez l'espace de noms android et définissez les attributs suivants :
    • Définissez l'attribut autoSizeTextType sur none ou uniform. La valeur none est la valeur par défaut, et uniform permet à TextView d'effectuer une mise à l'échelle uniforme sur l'axe horizontal et l'axe vertical.
    • Définissez l'attribut autoSizePresetSizes sur un tableau de tailles prédéfinies. Pour accéder au tableau en tant que ressource, définissez-le dans le fichier res/values/arrays.xml.
  • <resources>
      <array name="autosize_text_sizes">
        <item>10sp</item>
        <item>12sp</item>
        <item>20sp</item>
        <item>40sp</item>
        <item>100sp</item>
      </array>
    </resources>
    
    <?xml version="1.0" encoding="utf-8"?>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:autoSizeTextType="uniform"
        android:autoSizePresetSizes="@array/autosize_text_sizes" />
    

Configurer des tailles prédéfinies à l'aide de la bibliothèque Support

  • Pour utiliser des tailles prédéfinies afin de configurer le dimensionnement automatique de TextView de manière programmatique via la bibliothèque Support, appelez la méthode TextViewCompat.setAutoSizeTextTypeUniformWithPresetSizes(TextView textView, int[] presetSizes, int unit). Fournissez une instance de la classe TextView, un tableau de tailles et n'importe quelle unité de dimension TypedValue pour la taille.
  • Pour utiliser des tailles prédéfinies afin de configurer le dimensionnement automatique de TextView en XML via la bibliothèque Support, utilisez l'espace de noms app, et définissez les attributs autoSizeTextType et autoSizePresetSizes dans le fichier XML de mise en page.
  • <resources>
      <array name="autosize_text_sizes">
        <item>10sp</item>
        <item>12sp</item>
        <item>20sp</item>
        <item>40sp</item>
        <item>100sp</item>
      </array>
    </resources>
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
      <TextView
          android:layout_width="match_parent"
          android:layout_height="200dp"
          app:autoSizeTextType="uniform"
          app:autoSizePresetSizes="@array/autosize_text_sizes" />
    </LinearLayout>
    

Ressources supplémentaires

Pour en savoir plus sur le dimensionnement automatique d'une TextView lorsque vous utilisez du contenu dynamique, regardez la vidéo Android Jetpack: Dimensionnement automatique de TextView.