Ridimensiona automaticamente TextView

Con Android 8.0 (livello API 26) e versioni successive, puoi indicare a un TextView di consentire l'espansione o la riduzione automatica delle dimensioni del testo in modo da riempire il suo layout in base alle caratteristiche e ai limiti di TextView. Questa impostazione semplifica l'ottimizzazione delle dimensioni del testo su schermi diversi con contenuti dinamici.

Support Library 26.0 supporta completamente la funzionalità di ridimensionamento automatico TextView sui dispositivi con Android 8.0 (livello API 26) o versioni precedenti. Il pacchetto android.support.v4.widget contiene la classe TextViewCompat per accedere alle funzionalità in modo compatibile con le versioni precedenti.

Impostazione della dimensione automatica di TextView

Puoi utilizzare il framework o la libreria di supporto per configurare il ridimensionamento automatico di TextView in modo programmatico o in XML. Per impostare gli attributi XML, puoi anche utilizzare la finestra Proprietà in Android Studio.

Esistono tre modi per configurare il dimensionamento automatico di TextView, descritti nelle sezioni seguenti:

Nota: se imposti il dimensionamento automatico in un file XML, sconsigliamo di utilizzare il valore "wrap_content" per gli attributi layout_width o layout_height di un TextView. Questa operazione potrebbe produrre risultati imprevisti.

Predefinito

L'impostazione predefinita consente al ridimensionamento automatico di TextView di scalare uniformemente sugli assi orizzontale e verticale.

  • Per definire l'impostazione predefinita in modo programmatico, chiama il metodo setAutoSizeTextTypeWithDefaults(int autoSizeTextType) . Fornisci AUTO_SIZE_TEXT_TYPE_NONE per disattivare la funzionalità di ridimensionamento automatico o AUTO_SIZE_TEXT_TYPE_UNIFORM per scalare in modo uniforme gli assi orizzontale e verticale.
  • Nota: le dimensioni predefinite per la scalabilità uniforme sono minTextSize = 12sp, maxTextSize = 112sp e granularity = 1px.

  • Per definire l'impostazione predefinita in XML, utilizza lo spazio dei nomi android e imposta l'attributo autoSizeTextType su none o uniform.
  • <?xml version="1.0" encoding="utf-8"?>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:autoSizeTextType="uniform" />
    

Definire l'impostazione predefinita utilizzando la libreria di supporto

  • Per definire l'impostazione predefinita in modo programmatico tramite la libreria di supporto, chiama il metodo TextViewCompat.setAutoSizeTextTypeWithDefaults(TextView textview, int autoSizeTextType). Fornisci un'istanza del widget TextView e di uno dei tipi di testo, come TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE o TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM.
  • Per definire l'impostazione predefinita in XML tramite la Support Library, utilizza lo spazio dei nomi app e imposta l'attributo autoSizeTextType su 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>
    

Granularità

Puoi definire un intervallo di dimensioni minime e massime del testo e una dimensione che specifichi la dimensione di ogni passaggio. TextView ridimensiona in modo uniforme in un intervallo tra gli attributi di dimensione minima e massima. Ogni incremento si verifica come dimensione del passaggio impostata nell'attributo granularità.

  • Per definire un intervallo di dimensioni del testo e una dimensione in modo programmatico, chiama il metodo setAutoSizeTextTypeUniformWithConfiguration(int autoSizeMinTextSize, int autoSizeMaxTextSize, int autoSizeStepGranularity, int unit). Fornisci il valore massimo, il valore minimo, il valore di granularità e qualsiasi unità della dimensione TypedValue.
  • Per definire un intervallo di dimensioni del testo e una dimensione in XML, utilizza lo spazio dei nomi android e imposta i seguenti attributi:
    • Imposta l'attributo autoSizeTextType su none o uniform. Il valore none è il valore predefinito e uniform consente a TextView di scalare in modo uniforme sugli assi orizzontale e verticale.
    • Imposta gli attributi autoSizeMinTextSize, autoSizeMaxTextSize e autoSizeStepGranularity per definire le dimensioni per il ridimensionamento automatico di 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" />
    

Definizione della granularità utilizzando la libreria di supporto

  • Per definire un intervallo di dimensioni del testo e una dimensione in modo programmatico tramite la Support Library, chiama il metodo TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(int autoSizeMinTextSize, int autoSizeMaxTextSize, int autoSizeStepGranularity, int unit). Fornisci il valore massimo, il valore minimo, il valore di granularità e qualsiasi unità della dimensione TypedValue.
  • Per definire un intervallo di dimensioni del testo e una dimensione in XML tramite la Support Library, utilizza lo spazio dei nomi app e imposta gli attributi autoSizeText, autoSizeMinTextSize, autoSizeMaxTextSize e autoSizeStepGranularity nel file XML di 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>
    

Dimensioni preimpostate

Le dimensioni predefinite consentono di specificare i valori scelti da TextView durante il ridimensionamento automatico del testo.

  • Per utilizzare le dimensioni preimpostate per configurare il ridimensionamento automatico di TextView in modo programmatico, chiama il metodo setAutoSizeTextTypeUniformWithPresetSizes(int[] presetSizes, int unit). Fornisci un array di dimensioni e qualsiasi unità di dimensione TypedValue per la dimensione.
  • Per utilizzare le dimensioni preimpostate per configurare il dimensionamento automatico di TextView in XML, utilizza lo spazio dei nomi android e imposta i seguenti attributi:
    • Imposta l'attributo autoSizeTextType su none o uniform. Il valore none è il valore predefinito e uniform consente a TextView di scalare in modo uniforme sugli assi orizzontale e verticale.
    • Imposta l'attributo autoSizePresetSizes su un array di dimensioni preimpostate. Per accedere all'array come risorsa, definisci l'array nel file 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" />
    

Configurare le dimensioni preimpostate utilizzando la libreria di supporto

  • Per utilizzare le dimensioni preimpostate per configurare il ridimensionamento automatico di TextView in modo programmatico tramite la libreria di assistenza, chiama il metodo TextViewCompat.setAutoSizeTextTypeUniformWithPresetSizes(TextView textView, int[] presetSizes, int unit). Fornisci un'istanza della classe TextView, un array di dimensioni e qualsiasi unità della dimensione TypedValue per la dimensione.
  • Per utilizzare le dimensioni preimpostate per configurare il dimensionamento automatico di TextView in XML tramite la Support Library, utilizza lo spazio dei nomi app e imposta gli attributi autoSizeTextType e autoSizePresetSizes nel file XML di 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>
    

Risorse aggiuntive

Per ulteriori informazioni sul ridimensionamento automatico di un elemento TextView quando utilizzi contenuti dinamici, guarda il video Android Jetpack: Autosizing TextView.