Dimensionar TextViews automaticamente

Com o Android 8.0 (API de nível 26) ou versões mais recentes, é possível instruir um TextView para permitir que o tamanho do texto se expanda ou se contraia automaticamente para preencher o layout com base nas características e limites da TextView. Essa configuração facilita a otimização do tamanho do texto em telas diferentes com conteúdo dinâmico.

A Biblioteca de Suporte 26.0 oferece suporte total ao recurso de dimensionamento automático de TextView em dispositivos com o Android 8.0 (nível 26 da API) ou versões anteriores. O pacote android.support.v4.widget contém a classe TextViewCompat para acessar recursos de maneira compatível com versões anteriores.

Configurar o dimensionamento automático de TextView

Você pode usar o framework ou a Biblioteca de Suporte para configurar o dimensionamento automático de TextView de forma programática ou em XML. Para definir os atributos XML, você também pode usar a janela Properties no Android Studio.

Há três maneiras de configurar o dimensionamento automático de TextView, descritas nas seções a seguir:

Observação: se você configurar o dimensionamento automático em um arquivo XML, não recomendamos o uso do valor "wrap_content" para os atributos layout_width ou layout_height de um TextView. Isso pode gerar resultados inesperados.

Padrão

A configuração padrão permite que o dimensionamento automático de TextView seja escalonado de maneira uniforme nos eixos horizontal e vertical.

  • Para definir a configuração padrão de forma programática, chame o método setAutoSizeTextTypeWithDefaults(int autoSizeTextType) . Forneça AUTO_SIZE_TEXT_TYPE_NONE para desativar o recurso de dimensionamento automático ou AUTO_SIZE_TEXT_TYPE_UNIFORM para dimensionar os eixos horizontal e vertical de maneira uniforme.
  • Observação: as dimensões padrão para um escalonamento uniforme são minTextSize = 12sp, maxTextSize = 112sp e granularity = 1px..

  • Para definir a configuração padrão em XML, use o namespace android e defina o atributo autoSizeTextType como none ou uniform.
  • <?xml version="1.0" encoding="utf-8"?>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:autoSizeTextType="uniform" />
    

Definir a configuração padrão usando a Biblioteca de Suporte

  • Para definir a configuração padrão de forma programática com a Biblioteca de Suporte, chame o método TextViewCompat.setAutoSizeTextTypeWithDefaults(TextView textview, int autoSizeTextType). Forneça uma instância do widget TextView e um dos tipos de texto, como TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE ou TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM.
  • Para definir a configuração padrão em XML usando a Biblioteca de Suporte, use o namespace app e defina o atributo autoSizeTextType como 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>
    

Granularidade

Você pode definir um intervalo de tamanhos mínimo e máximo de texto e uma dimensão que especifique o tamanho de cada etapa. O TextView é dimensionado de maneira uniforme em um intervalo entre os atributos de tamanho mínimo e máximo. Cada incremento ocorre como o tamanho da etapa definido no atributo de granularidade.

  • Para definir um intervalo de tamanhos de texto e uma dimensão de forma programática, chame o método setAutoSizeTextTypeUniformWithConfiguration(int autoSizeMinTextSize, int autoSizeMaxTextSize, int autoSizeStepGranularity, int unit). Informe os valores máximo, mínimo, de granularidade e qualquer unidade de dimensão TypedValue.
  • Para definir um intervalo de tamanhos de texto e uma dimensão em XML, use o namespace android e defina os seguintes atributos:
    • Defina o atributo autoSizeTextType como none ou uniform. O valor none é o padrão, e uniform permite que TextView seja escalonado de maneira uniforme nos eixos horizontal e vertical.
    • Defina os atributos autoSizeMinTextSize, autoSizeMaxTextSize e autoSizeStepGranularity para definir as dimensões de dimensionamento automático do 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" />
    

Definir granularidade usando a Biblioteca de Suporte

  • Para definir um intervalo de tamanhos de texto e uma dimensão de forma programática com a Biblioteca de Suporte, chame o método TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(int autoSizeMinTextSize, int autoSizeMaxTextSize, int autoSizeStepGranularity, int unit). Informe os valores máximo, mínimo, de granularidade, bem como qualquer unidade de dimensão TypedValue.
  • Para definir um intervalo de tamanhos de texto e uma dimensão em XML com a Biblioteca de Suporte, use o namespace app e defina os atributos autoSizeText, autoSizeMinTextSize, autoSizeMaxTextSize e autoSizeStepGranularity no arquivo XML de layout.
  • <?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>
    

Tamanhos predefinidos

Os tamanhos predefinidos permitem especificar os valores que a TextView escolhe ao dimensionar automaticamente o texto.

  • Para usar os tamanhos predefinidos para configurar o dimensionamento automático de TextView de forma programática, chame o método setAutoSizeTextTypeUniformWithPresetSizes(int[] presetSizes, int unit). Forneça uma matriz de tamanhos e qualquer unidade de dimensão TypedValue para o tamanho.
  • Para usar tamanhos predefinidos para configurar o dimensionamento automático de TextView no XML, use o namespace android e defina os seguintes atributos:
    • Defina o atributo autoSizeTextType como none ou uniform. O valor none é o padrão, e uniform permite que TextView seja escalonado de maneira uniforme nos eixos horizontal e vertical.
    • Configure o atributo autoSizePresetSizes como uma matriz de tamanhos predefinidos. Para acessar a matriz como um recurso, defina-a no arquivo 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" />
    

Configurar tamanhos predefinidos usando a Biblioteca de Suporte

  • Para usar tamanhos predefinidos para configurar o dimensionamento automático de TextView de forma programática usando a Biblioteca de Suporte, chame o método TextViewCompat.setAutoSizeTextTypeUniformWithPresetSizes(TextView textView, int[] presetSizes, int unit). Forneça uma instância da classe TextView, uma matriz de tamanhos e qualquer unidade de dimensão TypedValue para o tamanho.
  • Para usar tamanhos predefinidos para configurar o dimensionamento automático de TextView em XML pela Biblioteca de Suporte, use o namespace app e defina os atributos autoSizeTextType e autoSizePresetSizes no arquivo XML do layout.
  • <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>
    

Outros recursos

Para saber mais sobre o dimensionamento automático de um TextView ao trabalhar com conteúdo dinâmico, assista Android Jetpack: dimensionamento automático da TextView.