В 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, чтобы равномерно масштабировать горизонтальную и вертикальную оси. - Чтобы определить настройку по умолчанию в XML, используйте пространство имен
androidи установите для атрибутаautoSizeTextTypeзначение none или Uniform .
Примечание . Размеры по умолчанию для равномерного масштабирования: minTextSize = 12sp , maxTextSize = 112sp и granularity = 1px.
<?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 .