TextView の自動サイズ調整

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

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

TextView の自動サイズを設定する

フレームワークまたはサポート ライブラリを使用して、TextView の自動サイズ設定をプログラムまたは XML で設定できます。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 名前空間を使用して次の属性を設定します。
    • autoSizeTextType 属性は none または uniform に設定します。デフォルトは none で、uniform を使用すると、TextView は水平軸と垂直軸で均一にスケーリングできます。
    • autoSizeMinTextSize 属性、autoSizeMaxTextSize 属性、autoSizeStepGranularity 属性を設定して、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" />
    

サポート ライブラリを使用して粒度を定義する

  • サポート ライブラリを介して、テキストサイズの範囲とディメンションをプログラムで定義するには、 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 名前空間を使用し、次の属性を設定します。
    • autoSizeTextType 属性は 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 ファイルで autoSizeTextType 属性と 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 の自動サイズ調整について詳しくは、Android Jetpack: Autosizing TextView をご覧ください。