Dimensionamento automático do TextView

Com o Android 8.0 (API de nível 26) e versões mais recentes, é possível instruir um TextView para que o tamanho do texto se expanda ou se contraia automaticamente para preencher o layout com base nas características e limites do 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 compatibilidade total com o recurso de dimensionamento automático do TextView em dispositivos com versões do Android anteriores à 8.0 (API de nível 26). A biblioteca oferece compatibilidade com o Android 4.0 (API de nível 14) e versões mais recentes. O pacote android.support.v4.widget contém a classe TextViewCompat para acessar recursos de maneira compatível com versões anteriores.

Como configurar o dimensionamento automático do TextView

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

Existem três maneiras de configurar o dimensionamento automático de TextView:

Observação: ao configurar o dimensionamento automático em um arquivo XML, não é recomendado usar o valor "wrap_content" para os atributos layout_width ou layout_height de um TextView. Isso pode causar resultados inesperados.

Padrão

A configuração padrão permite que o dimensionamento automático do TextView seja realizado 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 dimensionamento 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" />
    

Como usar a Biblioteca de Suporte

  • Para definir a configuração padrão de forma programática usando 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 conforme o tamanho do passo definido no atributo de granularidade.

Como usar 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). Forneça 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 usando a Biblioteca de Suporte, use o namespace app e configure 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

Com os tamanhos predefinidos, é possível especificar todos os valores que TextView seleciona quando o texto é dimensionado automaticamente.

  • 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 os tamanhos predefinidos para configurar o dimensionamento automático de TextView no XML, use o namespace android e defina os seguintes atributos:
    • Configure o atributo autoSizeText como none ou uniform. O none é um valor padrão, e o uniform permite dimensionar TextView 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" />
    

Como usar 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 no XML usando a Biblioteca de Suporte, use o namespace app e defina os atributos autoSizeText e autoSizePresetSizes no arquivo XML de 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 ver mais informações sobre como dimensionar automaticamente uma TextView ao trabalhar com conteúdo dinâmico, assista Dimensionamento automático do TextView.