With Android 8.0 (API level 26) and higher, you can instruct a
TextView to let the text size
expand or contract automatically to fill its layout based on the
TextView's characteristics and boundaries. This setting makes it easier to
optimize text size on different screens with dynamic content.
Support Library 26.0 fully supports the autosizing TextView
feature on devices running Android versions 8.0 (API level 26) or lower.
The android.support.v4.widget package contains the TextViewCompat
class to access features in a backward-compatible fashion.
Set up TextView autosize
You can either use the framework or Support Library to set up the autosizing of
TextView programmatically or in XML. To
set the XML attributes, you can also use the Properties
window in Android Studio.
There are three ways you can set up the autosizing of TextView,
described in the sections that follow:
Note: If you set autosizing in an XML file, we do not
recommended using the value "wrap_content" for the
layout_width or layout_height attributes of a
TextView. Doing so might produce
unexpected results.
Default
The default setting lets the autosizing of TextView scale
uniformly on horizontal and vertical axes.
- To define the default setting programmatically, call the
setAutoSizeTextTypeWithDefaults(int autoSizeTextType)method. ProvideAUTO_SIZE_TEXT_TYPE_NONEto turn off the autosizing feature orAUTO_SIZE_TEXT_TYPE_UNIFORMto scale the horizontal and the vertical axes uniformly. - To define the default setting in XML, use the
androidnamespace and set theautoSizeTextTypeattribute to none or uniform.
Note: The default dimensions for uniform
scaling are minTextSize = 12sp,
maxTextSize = 112sp, and granularity = 1px.
<?xml version="1.0" encoding="utf-8"?> <TextView android:layout_width="match_parent" android:layout_height="200dp" android:autoSizeTextType="uniform" />
Define the default setting using the Support Library
- To define the default setting programmatically through the Support Library,
call the
TextViewCompat.setAutoSizeTextTypeWithDefaults(TextView textview, int autoSizeTextType)method. Provide an instance of theTextViewwidget and one of the text types, such asTextViewCompat.AUTO_SIZE_TEXT_TYPE_NONEorTextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM. - To define the default setting in XML through the Support Library, use the
appnamespace and set theautoSizeTextTypeattribute to none or 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>
Granularity
You can define a range of minimum and maximum text sizes and a
dimension that specifies the size of each step. The
TextView scales uniformly in a range between the
minimum and maximum size attributes. Each increment occurs as the step
size set in the granularity attribute.
- To define a range of text sizes and a dimension programmatically, call
the
setAutoSizeTextTypeUniformWithConfiguration(int autoSizeMinTextSize, int autoSizeMaxTextSize, int autoSizeStepGranularity, int unit)method. Provide the maximum value, the minimum value, the granularity value, and anyTypedValuedimension unit. - To define a range of text sizes and a dimension in XML, use the
androidnamespace and set the following attributes:- Set the
autoSizeTextTypeattribute to either none or uniform. The none value is the default, and uniform letsTextViewscale uniformly on horizontal and vertical axes. - Set the
autoSizeMinTextSize,autoSizeMaxTextSize, andautoSizeStepGranularityattributes to define the dimensions for the autosizing ofTextView.
- Set the
<?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" />
Define granularity using the Support Library
- To define a range of text sizes and a dimension programmatically through the
Support Library, call the
TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(int autoSizeMinTextSize, int autoSizeMaxTextSize, int autoSizeStepGranularity, int unit)method. Provide the maximum value, the minimum value, the granularity value, and anyTypedValuedimension unit. - To define a range of text sizes and a dimension in XML through the Support
Library, use the
appnamespace and set theautoSizeText,autoSizeMinTextSize,autoSizeMaxTextSize, andautoSizeStepGranularityattributes in the layout XML file.
<?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>
Preset sizes
Preset sizes let you specify the values that the
TextView picks when autosizing text.
-
To use preset sizes to set up the autosizing of
TextViewprogrammatically, call thesetAutoSizeTextTypeUniformWithPresetSizes(int[] presetSizes, int unit)method. Provide an array of sizes and anyTypedValuedimension unit for the size. -
To use preset sizes to set up the autosizing of
TextViewin XML, use theandroidnamespace and set the following attributes:- Set the
autoSizeTextTypeattribute to either none or uniform. The none value is the default, and uniform letsTextViewscale uniformly on horizontal and vertical axes. - Set the
autoSizePresetSizesattribute to an array of preset sizes. To access the array as a resource, define the array in theres/values/arrays.xmlfile.
- Set the
<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" />
Set up preset sizes using the Support Library
- To use preset sizes to set up the autosizing of
TextViewprogrammatically through the Support Library, call theTextViewCompat.setAutoSizeTextTypeUniformWithPresetSizes(TextView textView, int[] presetSizes, int unit)method. Provide an instance of theTextViewclass, an array of sizes, and anyTypedValuedimension unit for the size. - To use preset sizes to set up the autosizing of
TextViewin XML through the Support Library, use theappnamespace and set theautoSizeTextTypeandautoSizePresetSizesattributes in the layout XML file.
<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>
Additional resources
For additional information on autosizing a TextView when working with dynamic
content, watch
Android Jetpack: Autosizing TextView.