Dimensionar TextViews automaticamente

Com o Android 8.0 (API de nível 26) e versões mais recentes, é possível instruir TextView para permitir que o tamanho do texto expandir ou contrair-se automaticamente para preencher o layout com base na Características e limites de TextView. Com essa configuração, otimize o tamanho do texto em diferentes telas com conteúdo dinâmico.

A Biblioteca de Suporte 26.0 oferece suporte total ao 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 o TextViewCompat. para acessar recursos de maneira compatível com versões anteriores.

Configurar o dimensionamento automático da TextView

É possível usar o framework ou a Biblioteca de Suporte para configurar o dimensionamento automático de TextView programaticamente 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ê definir o dimensionamento automático em um arquivo XML, não definiremos recomendado usar o valor "wrap_content" para o atributos layout_width ou layout_height de um TextView. Isso pode produzir resultados inesperados.

Padrão

A configuração padrão permite o dimensionamento automático do TextView 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) . Informe 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 autoSizeTextType como none ou uniforme.
  • <?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 por meio da 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 pela Biblioteca de Suporte, use o método o namespace app e defina o 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 a 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 e granularidade e qualquer TypedValue unidade de dimensão.
  • Para definir um intervalo de tamanhos de texto e uma dimensão em XML, use o método android namespace e configure os seguintes atributos:
    • Defina o autoSizeTextType como none ou uniform. O valor none é o padrão, e uniforme permite TextView são dimensionadas de maneira uniforme na horizontal e eixos verticais.
    • Defina o autoSizeMinTextSize, autoSizeMaxTextSize, e autoSizeStepGranularity para definir as dimensões de dimensionamento automático 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 por meio do da 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 e qualquer unidade de dimensão TypedValue.
  • Para definir um intervalo de tamanhos de texto e uma dimensão em XML por meio do Suporte biblioteca, use o namespace app e defina o autoSizeText, autoSizeMinTextSize autoSizeMaxTextSize e Atributos 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 o O TextView escolhe ao dimensionar o texto 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:
    • Defina o autoSizeTextType como none ou uniform. O parâmetro none valor é o padrão, e uniforme permite TextView são dimensionadas de maneira uniforme na horizontal e eixos verticais.
    • 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" />
    

Definir tamanhos predefinidos usando a Biblioteca de Suporte

  • Para usar tamanhos predefinidos para configurar o dimensionamento automático de TextView de maneira programática pela Biblioteca de Suporte, chame o método TextViewCompat.setAutoSizeTextTypeUniformWithPresetSizes(TextView textView, int[] presetSizes, int unit) . Forneça uma instância da classe TextView, um 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 app e defina autoSizeTextType 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 mais informações sobre como dimensionar automaticamente um TextView ao trabalhar com recursos dinâmicos conteúdo, assistir Android Jetpack: dimensionamento automático do TextView (em inglês).