TextView の自動サイズ調整

Android 8.0(API レベル 26)以上では、テキストサイズを自動的に拡大または縮小し、TextView の特性と境界に基づいてレイアウトを埋めるよう TextView に指示できます。このように設定すると、動的コンテンツを表示するさまざまな画面で、テキストサイズの最適化が容易になります。

サポート ライブラリ 26.0 は、Android 8.0(API レベル 26)より前のバージョンの Android を搭載したデバイスで、TextView の自動サイズ調整機能を完全にサポートします。このライブラリは、Android 4.0(API レベル 14)以上をサポートします。android.support.v4.widget パッケージには、下位互換性のある方法で機能にアクセスする TextViewCompat クラスが含まれています。

TextView の自動サイズ調整の設定

フレームワークまたはサポート ライブラリのいずれかを使用して、プログラムまたは XML で TextView の自動サイズ調整を設定できます。XML 属性を設定するには、Android Studio の [Properties] ウィンドウも利用できます。

TextView の自動サイズ調整を設定するには、以下の 3 つの方法があります。

: XML ファイルで自動サイズ調整を設定する場合、TextViewlayout_width 属性または layout_height 属性に値「wrap_content」を使用することはおすすめしません。そのようにすると、予期しない結果が発生する可能性があります。

デフォルト

デフォルト設定では、TextView の自動サイズ調整により、横軸と縦軸で均一に拡大縮小が行われます。

  • デフォルト設定をプログラムで定義するには、setAutoSizeTextTypeWithDefaults(int autoSizeTextType) メソッドを呼び出します。AUTO_SIZE_TEXT_TYPE_NONE を指定して自動サイズ調整機能をオフにするか、AUTO_SIZE_TEXT_TYPE_UNIFORM を指定して横軸と縦軸で均一に拡大縮小します。
  • : 均一な拡大縮小のデフォルトのディメンションは、minTextSize = 12spmaxTextSize = 112spgranularity = 1px. です。

  • XML でデフォルト設定を定義するには、android 名前空間を使用し、autoSizeTextType 属性を none または uniform に設定します。
  • <?xml version="1.0" encoding="utf-8"?>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:autoSizeTextType="uniform" />
    

サポート ライブラリの使用

  • サポート ライブラリを介してプログラムでデフォルト設定を定義するには、TextViewCompat.setAutoSizeTextTypeWithDefaults(TextView textview, int autoSizeTextType) メソッドを呼び出します。TextView ウィジェットのインスタンスと、TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONETextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM などのテキストタイプのいずれかを指定します。
  • サポート ライブラリを介して XML でデフォルト設定を定義するには、app 名前空間を使用し、autoSizeTextType 属性を none または 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>
    

粒度

最小と最大のテキストサイズ範囲と、各ステップのサイズを指定するディメンションを定義できます。TextView は、最小サイズ属性と最大サイズ属性の範囲内で均一に拡大縮小します。各増分は、粒度属性で設定されたステップサイズに従って生成されます。

  • テキストサイズの範囲とディメンションをプログラムで定義するには、setAutoSizeTextTypeUniformWithConfiguration(int autoSizeMinTextSize, int autoSizeMaxTextSize, int autoSizeStepGranularity, int unit) メソッドを呼び出します。最大値、最小値、粒度値、任意の TypedValue ディメンション単位を指定します。
  • XML でテキストサイズの範囲とディメンションを定義するには、android 名前空間を使用し、次の属性を設定します。
  • <?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" />
    

サポート ライブラリの使用

  • サポート ライブラリを介してプログラムでテキストサイズの範囲とディメンションを定義するには、TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(int autoSizeMinTextSize, int autoSizeMaxTextSize, int autoSizeStepGranularity, int unit) メソッドを呼び出します。最大値、最小値、粒度値、任意の TypedValue ディメンション単位を指定します。
  • サポート ライブラリを介して XML でテキストサイズの範囲とディメンションを定義するには、app 名前空間を使用し、レイアウト XML ファイルで autoSizeText 属性、autoSizeMinTextSize 属性、autoSizeMaxTextSize 属性、autoSizeStepGranularity 属性を設定します。
  • <?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>
    

プリセット サイズ

プリセット サイズでは、テキストの自動サイズ調整時に TextView が選択するすべての値を指定できます。

  • プリセット サイズを使用してプログラムで TextView の自動サイズ調整を設定するには、setAutoSizeTextTypeUniformWithPresetSizes(int[] presetSizes, int unit) メソッドを呼び出します。サイズの配列と、サイズの任意の TypedValue ディメンション単位を指定します。
  • プリセット サイズを使用して XML で TextView の自動サイズ調整を設定するには、android 名前空間を使用し、次の属性を設定します。
    • autoSizeText 属性を none または uniform に設定します。none はデフォルト値です。uniform を設定すると、TextView が横軸と縦軸で均一に拡大縮小されます。
    • autoSizePresetSizes 属性をプリセット サイズの配列に設定します。リソースとして配列にアクセスするには、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" />
    

サポート ライブラリの使用

  • プリセット サイズを使用し、サポート ライブラリを介してプログラムで TextView の自動サイズ調整を設定するには、TextViewCompat.setAutoSizeTextTypeUniformWithPresetSizes(TextView textView, int[] presetSizes, int unit) メソッドを呼び出します。TextView クラスのインスタンス、サイズの配列、サイズの任意の TypedValue ディメンション単位を指定します。
  • プリセット サイズを使用し、サポート ライブラリを介して XML で TextView の自動サイズ調整を設定するには、app 名前空間を使用し、レイアウト XML ファイルで autoSizeText 属性と autoSizePresetSizes 属性を設定します。
  • <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>
    

参考情報

動的コンテンツを扱う際の TextView の自動サイズ調整については、TextView の自動サイズ調整の動画をご覧ください。