Con Android 8.0 (nivel de API 26) y versiones posteriores, puedes darle instrucciones a TextView
para que el tamaño del texto se expanda o se contraiga automáticamente a fin de llenar su diseño según las características y los límites de TextView
. Esta configuración facilita la optimización del tamaño del texto en diferentes pantallas con contenido dinámico.
La biblioteca de compatibilidad 26.0 es totalmente compatible con la función TextView
de ajuste automático de tamaño en dispositivos con Android 8.0 (nivel de API 26) o versiones anteriores.
El paquete android.support.v4.widget
contiene la clase TextViewCompat
para acceder a las funciones de manera retrocompatible.
Cómo configurar el tamaño automático de TextView
Puedes usar el framework o la biblioteca de compatibilidad para configurar el ajuste automático de tamaño de TextView
de manera programática o en XML. Para configurar los atributos XML, también puedes usar la ventana Properties en Android Studio.
Existen tres maneras de configurar el ajuste automático de tamaño de TextView
, que se describen en las siguientes secciones:
Nota: Si configuras el ajuste automático de tamaño en un archivo en formato XML, no te recomendamos que uses el valor "wrap_content" para los atributos layout_width
o layout_height
de un TextView
. Si lo haces, es posible que se produzcan resultados inesperados.
Predeterminada
La configuración predeterminada permite que el ajuste automático de tamaño de TextView
escale de manera uniforme en los ejes horizontal y vertical.
- Para definir la configuración predeterminada de forma programática, llama al método
setAutoSizeTextTypeWithDefaults(int autoSizeTextType)
. ProporcionaAUTO_SIZE_TEXT_TYPE_NONE
para desactivar la función de ajuste automático de tamaño oAUTO_SIZE_TEXT_TYPE_UNIFORM
para escalar de manera uniforme los ejes horizontal y vertical. - Para definir la configuración predeterminada en XML, usa el espacio de nombres
android
y establece el atributoautoSizeTextType
en none o uniform.
Nota: Las dimensiones predeterminadas para el escalamiento uniforme son minTextSize = 12sp
, maxTextSize = 112sp
y granularity = 1px.
.
<?xml version="1.0" encoding="utf-8"?> <TextView android:layout_width="match_parent" android:layout_height="200dp" android:autoSizeTextType="uniform" />
Cómo definir la configuración predeterminada con la biblioteca de compatibilidad
- Para definir la configuración predeterminada de forma programática a través de la biblioteca de compatibilidad, llama al método
TextViewCompat.setAutoSizeTextTypeWithDefaults(TextView textview, int autoSizeTextType)
. Proporciona una instancia del widgetTextView
y uno de los tipos de texto, comoTextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE
oTextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM
. - Para definir la configuración predeterminada en XML a través de la biblioteca de compatibilidad, usa el espacio de nombres
app
y establece el atributoautoSizeTextType
en none o 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>
Nivel de detalle
Puedes definir un rango de tamaños de texto mínimo y máximo, y una dimensión que especifique el tamaño de cada paso. TextView
escala de manera uniforme en un rango entre los atributos de tamaño mínimo y máximo. Cada incremento ocurre como el tamaño del paso configurado en el atributo de nivel de detalle.
- Para definir un rango de tamaños de texto y una dimensión de forma programática, llama al método
setAutoSizeTextTypeUniformWithConfiguration(int autoSizeMinTextSize, int autoSizeMaxTextSize, int autoSizeStepGranularity, int unit)
. Proporciona el valor máximo, el valor mínimo, el valor de nivel de detalle y cualquier unidad de dimensiónTypedValue
. - Para definir un rango de tamaños de texto y una dimensión en XML, usa el espacio de nombres
android
y configura los siguientes atributos:- Establece el atributo
autoSizeTextType
en none o uniform. El valor none es el predeterminado, y uniform permite queTextView
escale de manera uniforme en los ejes horizontal y vertical. - Configura los atributos
autoSizeMinTextSize
,autoSizeMaxTextSize
yautoSizeStepGranularity
para definir las dimensiones del ajuste automático de tamaño deTextView
.
- Establece el atributo
<?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" />
Cómo definir el nivel de detalle con la biblioteca de compatibilidad
- Para definir un rango de tamaños de texto y una dimensión de manera programática a través de la biblioteca de compatibilidad, llama al método
TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(int autoSizeMinTextSize, int autoSizeMaxTextSize, int autoSizeStepGranularity, int unit)
. Proporciona el valor máximo, el valor mínimo, el valor de nivel de detalle y cualquier unidad de dimensiónTypedValue
. - Para definir un rango de tamaños de texto y una dimensión en XML a través de la biblioteca de compatibilidad, usa el espacio de nombres
app
y configura los atributosautoSizeText
,autoSizeMinTextSize
,autoSizeMaxTextSize
yautoSizeStepGranularity
en el archivo en formato XML de diseño.
<?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>
Tamaños predeterminados
Los tamaños predeterminados te permiten especificar los valores que TextView
selecciona cuando ajusta automáticamente el tamaño del texto.
-
Llama al método
setAutoSizeTextTypeUniformWithPresetSizes(int[] presetSizes, int unit)
para usar los tamaños predeterminados con el objetivo de configurar el ajuste automático de tamaño deTextView
de forma programática. Proporciona un arreglo de tamaños y cualquier unidad de dimensiónTypedValue
para el tamaño. -
Si quieres usar tamaños predeterminados para configurar el ajuste automático de tamaño de
TextView
en XML, usa el espacio de nombresandroid
y configura los siguientes atributos:- Establece el atributo
autoSizeTextType
en none o uniform. El valor none es el predeterminado, y uniform permite queTextView
escale de manera uniforme en los ejes horizontal y vertical. - Configura el atributo
autoSizePresetSizes
en un arreglo de tamaños predeterminados. Para acceder al arreglo como un recurso, defínelo en el archivores/values/arrays.xml
.
- Establece el atributo
<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" />
Cómo configurar tamaños predeterminados con la biblioteca de compatibilidad
- Si quieres usar tamaños predeterminados para configurar el ajuste automático de tamaño de
TextView
de manera programática a través de la biblioteca de compatibilidad, llama al métodoTextViewCompat.setAutoSizeTextTypeUniformWithPresetSizes(TextView textView, int[] presetSizes, int unit)
. Proporciona una instancia de la claseTextView
, un array de tamaños y cualquier unidad de dimensiónTypedValue
para el tamaño. - Para usar tamaños predeterminados a fin de configurar el ajuste automático de tamaño de
TextView
en XML a través de la biblioteca de compatibilidad, usa el espacio de nombresapp
y configura los atributosautoSizeTextType
yautoSizePresetSizes
en el archivo en formato XML de diseño.
<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>
Recursos adicionales
Para obtener información adicional sobre el ajuste automático de tamaño de un TextView
cuando trabajas con contenido dinámico, mira el video Android Jetpack: Ajuste automático de tamaño de TextView.