Автоматический размер текстовых представлений

В Android 8.0 (уровень API 26) и более поздних версиях вы можете указать TextView автоматически увеличивать или уменьшать размер текста, чтобы заполнить его макет на основе характеристик и границ TextView . Этот параметр упрощает оптимизацию размера текста на разных экранах с динамическим контентом.

Библиотека поддержки 26.0 полностью поддерживает функцию автоматического изменения размера TextView на устройствах под управлением Android версии 8.0 (уровень API 26) или ниже. Пакет android.support.v4.widget содержит класс TextViewCompat для доступа к функциям с обратной совместимостью.

Настроить авторазмер TextView

Вы можете использовать платформу или библиотеку поддержки для настройки автоматического изменения размера TextView программно или в XML. Чтобы установить атрибуты XML, вы также можете использовать окно «Свойства» в Android Studio.

Существует три способа настройки автоматического изменения размера TextView , описанные в следующих разделах:

Примечание . Если вы установили автоматическое изменение размера в XML-файле, мы не рекомендуем использовать значение «wrap_content» для атрибутов layout_width или layout_height TextView . Это может привести к неожиданным результатам.

По умолчанию

Настройка по умолчанию позволяет автоматически масштабировать TextView равномерно по горизонтальной и вертикальной осям.

  • Чтобы программно определить настройку по умолчанию, вызовите метод setAutoSizeTextTypeWithDefaults(int autoSizeTextType) . Укажите AUTO_SIZE_TEXT_TYPE_NONE , чтобы отключить функцию автоматического изменения размера, или AUTO_SIZE_TEXT_TYPE_UNIFORM , чтобы равномерно масштабировать горизонтальную и вертикальную оси.
  • Примечание . Размеры по умолчанию для равномерного масштабирования: minTextSize = 12sp , maxTextSize = 112sp и granularity = 1px.

  • Чтобы определить настройку по умолчанию в XML, используйте пространство имен android и установите для атрибута autoSizeTextType значение none или Uniform .
  • <?xml version="1.0" encoding="utf-8"?>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:autoSizeTextType="uniform" />
    

Определите настройку по умолчанию с помощью библиотеки поддержки.

  • Чтобы программно определить настройку по умолчанию через библиотеку поддержки, вызовите метод TextViewCompat.setAutoSizeTextTypeWithDefaults(TextView textview, int autoSizeTextType) . Предоставьте экземпляр виджета TextView и один из типов текста, например TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE или TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM .
  • Чтобы определить настройку по умолчанию в XML через библиотеку поддержки, используйте пространство имен app и установите для атрибута autoSizeTextType значение none или 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>
    

Детализация

Вы можете определить диапазон минимального и максимального размеров текста, а также размер, определяющий размер каждого шага. TextView масштабируется равномерно в диапазоне между атрибутами минимального и максимального размера. Каждое приращение происходит как размер шага, установленный в атрибуте детализации.

  • Чтобы программно определить диапазон размеров текста и размерность, вызовите метод setAutoSizeTextTypeUniformWithConfiguration(int autoSizeMinTextSize, int autoSizeMaxTextSize, int autoSizeStepGranularity, int unit) . Укажите максимальное значение, минимальное значение, значение детализации и любую единицу измерения TypedValue .
  • Чтобы определить диапазон размеров текста и размерность в XML, используйте пространство имен android и установите следующие атрибуты:
    • Установите для атрибута autoSizeTextType значение none или Uniform . Значение none используется по умолчанию, а значение Uniform позволяет TextView равномерно масштабироваться по горизонтальной и вертикальной осям.
    • Установите атрибуты autoSizeMinTextSize , autoSizeMaxTextSize и autoSizeStepGranularity , чтобы определить размеры для автоматического изменения размера 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" />
    

Определите степень детализации с помощью библиотеки поддержки

  • Чтобы определить диапазон размеров текста и размер программно через библиотеку поддержки, вызовите метод TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(int autoSizeMinTextSize, int autoSizeMaxTextSize, int autoSizeStepGranularity, int unit) . Укажите максимальное значение, минимальное значение, значение детализации и любую единицу измерения TypedValue .
  • Чтобы определить диапазон размеров текста и размерность в XML через библиотеку поддержки, используйте пространство имен app и установите атрибуты autoSizeText , autoSizeMinTextSize , autoSizeMaxTextSize и autoSizeStepGranularity в XML-файле макета.
  • <?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>
    

Предустановленные размеры

Предустановленные размеры позволяют указать значения, которые TextView выбирает при автоматическом изменении размера текста.

  • Чтобы использовать предустановленные размеры для программной настройки автоматического изменения размера TextView , вызовите метод setAutoSizeTextTypeUniformWithPresetSizes(int[] presetSizes, int unit) . Укажите массив размеров и любую единицу измерения TypedValue для этого размера.
  • Чтобы использовать предустановленные размеры для настройки автоматического изменения размера TextView в XML, используйте пространство имен android и установите следующие атрибуты:
    • Установите для атрибута autoSizeTextType значение none или Uniform . Значение none используется по умолчанию, а значение Uniform позволяет TextView равномерно масштабироваться по горизонтальной и вертикальной осям.
    • Задайте для атрибута autoSizePresetSizes массив предустановленных размеров. Чтобы получить доступ к массиву как к ресурсу, определите массив в файле 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" />
    

Настройте предустановленные размеры с помощью библиотеки поддержки.

  • Чтобы использовать предустановленные размеры для программной настройки автоматического изменения размера TextView через библиотеку поддержки, вызовите метод TextViewCompat.setAutoSizeTextTypeUniformWithPresetSizes(TextView textView, int[] presetSizes, int unit) . Предоставьте экземпляр класса TextView , массив размеров и любую единицу измерения TypedValue для этого размера.
  • Чтобы использовать предустановленные размеры для настройки автоматического изменения размера TextView в XML через библиотеку поддержки, используйте пространство имен app и установите атрибуты autoSizeTextType и autoSizePresetSizes в 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"?>
    <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>
    

Дополнительные ресурсы

Дополнительную информацию об автоматическом изменении размера TextView при работе с динамическим содержимым см. в статье Android Jetpack: Autosizing TextView .