Material design recommends using a dynamic type text instead of smaller type sizes or truncating large size text. Android making this much easier to implement with the introduction of TextView auto-sizing. With Android O and Support Library 26.0+, TextView gains a new property auto-size text type which allows you to optimize the text size when working with dynamic content.
Adding support library dependency
The Support Library provides full support to the auto sizing TextView feature on devices running Android versions prior to Android 8.0 (API level 26). The android.support.v4.widget package contains the TextViewCompat class to access features in a backward-compatible fashion. Support Library 26 has now been moved to Google’s maven repository, first include that in your project level build.gradle.
buildscript { repositories { google() } .... }
Add the support library in your app level build.gradle.
dependencies { .... implementation 'com.android.support:support-v4:26.0.2' }
Enable Autosizing
To enable auto-size in XML, set autoSizeTextType
to uniform
.This scales the text uniformly on horizontal and vertical axes, ignoring the text size attribute.When using support Library, make sure you use the app namespace.Note that you shouldn’t use wrap_content
for layout width or layout height for a textView set to auto-size since it may produce unexpected results.Instead, use match_prent
or a fixedsize
.
<?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>
Turn off auto-sizing by selecting none
instead of uniform
. You can also use auto-size programmatically like this.
TextViewCompat.setAutoSizeTextTypeWithDefaults(TextView textview, int autoSizeTextType)
Provide an instance of the TextView widget and one of the text types, such asTextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE
or TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM
.
Customize TextView
If you want to customize your TextView more, it has some extra attributes for you to auto-size min and max text size and step granularity.The TextView will scale uniformly in the range between the minimum and the maximum size in increments of step granularity.If you don’t set these properties, the default values will be used. To define a range of text sizes and a dimension in XML, use the app
namespace and set the following attributes:
- Set the
autoSizeText
attribute to either none or uniform. none is a default value and uniform lets TextView scale uniformly on horizontal and vertical axes. - Set
autoSizeMinTextSize
,autoSizeMaxTextSize
, andautoSizeStepGranularity
attributes to define the dimensions for the autosizing of TextView.
<?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>
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 any TypedValue dimension unit.
Preset Sizes
To have more control over the final size, for example, your app needs to comply with specific text size design guidelines, you can provide a list of size, and it will use the largest one that fits. Create an array with the size in your resources and then set the auto-size present sizes attribute in the XML.
<resources> <array name="autosize_text_sizes"> <item>10sp</item> <item>12sp</item> <item>20sp</item> <item>40sp</item> <item>100sp</item> </array> </resources>
<TextView android:layout_width="match_parent" android:layout_height="200dp" android:autoSizeTextType="uniform" app:autoSizePresetSizes="@array/autosize_text_sizes" />
To use preset sizes to set up the auto-sizing of TextView programmatically through the support library, call theTextViewCompat.setAutoSizeTextTypeUniformWithPresetSizes(TextView textView, int[] presetSizes, int unit)
method. Provide an instance of the TextView class, an array of sizes, and any TypedValue dimension unit for the size.
]]>