TextView的自适应大小在Android O上不起作用

55

我使用支持库26中添加的新自适应调整大小功能。我阅读了文档,可以在这里找到: https://developer.android.com/preview/features/autosizing-textview.html

我认为它应该这样工作:您可以使用此属性启用自动调整大小:app:autoSizeTextType="uniform"。我认为TextView应该利用所有可用空间来显示整个文本(而不只是一部分-它不应该被裁剪),并且textSize应该尽可能大。如果您需要限制文本的最大或最小大小,则可以使用这两个属性:

app:autoSizeMinTextSize="XXsp" // (you can also use px or dp values.)
或者
app:autoSizeMaxTextSize="XXsp"

目前为止一切顺利。假设我需要一个宽度为56dp的TextView。我有不同长度的文本,并且想将这些文本设置到此中。它应该自动调整大小,以便在最大可能的textSize下显示整个文本(所有字符+未被裁剪)。

这是我的TextView:

<android.support.v7.widget.AppCompatTextView
        android:id="@+id/vName"
        style="@style/TextView.AutoSize"
        android:layout_width="56dp"
        android:gravity="bottom|center_horizontal"
        android:maxLines="1"
        app:autoSizeMinTextSize="1px"
        app:autoSizeTextType="uniform"
        app:layout_constraintBottom_toTopOf="@id/vGuideline"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent" />

很不幸,文本视图被裁剪了。我想将此字符串设置为上面的文本视图的文本:“Groupa”,但结果是:

enter image description here

(TextView在带有黄色圆圈背景的约束布局中。)

如您所见,文本视图根本没有重新调整大小。你有什么办法吗?

谢谢。


你的目标API级别是多少? - kira_codes
我的目标 API 级别是 26。 - Tom Wayne
刚试了一下,遇到了类似的问题,我发现文本会缩小一点,但不足以容纳整个文本。我正在使用支持26的版本。 - Alex
我通过限制文本大小和粒度来使其工作,从而生成了一个较小的数组。<TextView android:id="@android:id/title" style="@style/TextAppearance.AppCompat.Title" android:maxLines="1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/primary_text_dark" app:autoSizeTextType="uniform" app:autoSizeMinTextSize="12sp" app:autoSizeMaxTextSize="20sp" app:autoSizeStepGranularity="2sp" tools:text="标题" /> - Alex
你把它放在LinearLayout里了吗?(根据Android的自动调整大小的TextView指南)。 - EmmanuelMess
显示剩余5条评论
12个回答

59

除了其他正确的答案外,我发现另一个点阻止了自动调整大小的工作。

不要将 android:singleLine="true" 与自动调整大小一起使用。请改用新的 android:maxLines="1"


57

我已经测试了几种情况,并得出以下结论:

你必须拥有有限的宽度高度。例如,如果你将宽度设置为match_parent但高度为wrap_content,我认为Android不知道你想要拉伸文本的高度。在你的示例中,你没有指定特定的高度,所以我认为这就是为什么它不起作用的原因。

例如:

高度为wrap content的文本

高度为特定值的文本

我不知道为什么Android官方文档会使用wrap_content作为例子......

而且你可以看到,在我的示例中,我没有使用其他属性,所以它可能不是属性设置不正确的问题。

是的,我使用的TextView是android.support.v7.widget.AppCompatTextView

只要你使用支持库26.0.0或以上版本,就足够了。

编辑:

对于ConstraintLayout,原则是相同的。你应该有有限的宽度和高度,也就是每个维度都满足以下任意一个条件:

  1. 你已经为该维度指定了绝对值(宽度或高度)

  2. 你已经将约束设置为两个方向

例如:

全部4个方向都被约束 高度被设置成绝对值 宽度被设置成绝对值

更新:(2017-09-21)

我测试了一下,不幸的是看起来它还不支持自定义字体类型,这是在支持库v26中一起发布的功能...


有没有办法让这个也适用于Android的EditText? - SagePawan
@SagePawan EditText 继承自 TextView,所以它应该可以工作,但我还没有尝试过。如果它不起作用,我认为就没有简单的方法了。 - Sira Lam
3
我之前制作了一种自定义字体的文本视图,它是基于AppCompatTextView的扩展。这种方式可以很好地与autosize特性搭配使用。所以,如果你需要使用自定义字体并具备autosize功能,可以尝试使用它(类似于此处提供的方案,但是我是基于AppCompatTextView进行扩展,而不是普通的TextView)。 - Justin Liu
1
@JustinLiu 谢谢!顺便提醒一下,如果你要为自定义字体子类化TextView,请注意缓存Typeface,否则会消耗大量系统资源(createTypeFace是一个重型方法,每次创建TextView时都会调用它,如果你不缓存它)。 - Sira Lam
1
@SiraLam 不确定您是否仍然想要调查此问题。但是,根据我的经验,我无法使“EditText”自动调整大小。我已将我的“EditText”绑定在宽度和高度上。我尝试过在XML和程序中定义自动调整大小,但似乎不起作用。 - coolDude
显示剩余2条评论

10

你将android:layout_height属性设置为了什么值?

来自文档:“如果在XML文件中设置了自动调整大小,则不建议在TextView的layout_width或layout_height属性中使用“wrap_content”值,这可能会产生意外的结果。"

我还创建了一个关于自动调整大小的TextView的教程。


10

我遇到了同样的问题。我通过更改gradle中的两行代码来解决它: compile 'com.android.support:support-v4:26.0.1'compile 'com.android.support:appcompat-v7:26.0.1' 如果要适应更长的文本,您需要添加所有四个选项,如下所示:

<android.support.v7.widget.AppCompatTextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/your_string"
        app:autoSizeTextType="uniform"
        app:autoSizeMaxTextSize="13sp"
        app:autoSizeMinTextSize="5sp"
        app:autoSizeStepGranularity="1sp"/>

1
实际上,在XML中你不应该使用AppCompatTextView - 支持库会在加载布局时自动将所有视图转换为AppCompat版本。 - npace
3
只有当目标 API 版本为 26 或更高版本时,这个说法才是正确的。如果使用 TextView,会出现“意外的命名空间前缀”警告。 - luoser
请参考此方法以避免命名空间警告。 - lilbiscuit

6

@Sira Lam的答案中还有一些额外信息:

请务必确保不继承可能与AutoTextSize行为冲突的属性,特别是android:singleLine

即使android:maxLinesandroid:lines没有阻止TextView自适应大小,当将singleLine属性设置为true时,会完全禁用任何自动调整大小功能。

因此,在查找AutoTextSize问题时,请首先尝试搜索singleLine属性,因为在扩展Button时有时会继承该属性。


6

在我的情况下,问题非常愚蠢:虽然自动调整大小对我来说一直很好用,但在一个TextView上,我使用了android:命名空间而不是app:!我完全没有意识到我的错误,一直想知道为什么它不起作用。因此,在使用AppCompat主题时,请确保使用AppCompat属性,而不是原生属性。


谢谢你指出这个问题。我也犯了同样的错误,让我很疯狂! - Marios

6

请确保勾选以下选项,以使自动调整文本大小起作用:

  • 不要在任何尺寸上使用wrap_content(如layout_widthlayout_height
  • 确保不使用singleLine,而是使用android:maxLines
  • 请使用app:autosizexxx代替android:autosizexxx,以支持旧版Android系统
  • 自动调整文本大小适用于AppCompatTextViewTextView,因此您无需更改视图

4

你尝试过设置链接中所描述的四个属性吗?

例如:

app:autoSizeTextType="uniform"
app:autoSizeMaxTextSize="13sp"
app:autoSizeMinTextSize="5sp"
app:autoSizeStepGranularity="1sp"

你还可以尝试将宽度和高度都设置为wrap_content,并将minWidth和maxWidth设置为56dp。
正如poss在评论中提到的,maxlines似乎会引起问题(对我也是如此),所以尝试删除它(自动调整文本大小应该能够解决这个问题,通过减少文本大小)。

3

按照以下方式配置您的TextView

<TextView
    android:id="@+id/vName"
    android:layout_width="56dp"
    android:layout_height="wrap_content"
    android:maxLines="1"
    android:text="Groupa"
    app:autoSizeMinTextSize="12sp"
    app:autoSizeMaxTextSize="20sp"
    app:autoSizeTextType="uniform"
    />

适用于Android 22, 23, 26
enter image description here


您的意思是这个功能在旧版Android上可以使用吗? - Slion
1
@Slion 是的。如果您使用的是支持库> 26,则在旧版本上也可以很好地工作。 - Linh
由于某些原因,我无法在Android 7.1.1、API 25设备上运行它,但在API 26设备上却可以正常工作。文本视图可以工作,但除非在Android 8上运行,否则它不会执行自动调整大小的操作。 - Slion
这是错误的。不要在AutoSize中使用wrap_content。官方文档明确指出:注意:如果您在XML文件中设置了自动调整大小,则不建议在TextView的layout_width或layout_height属性中使用“wrap_content”值。这可能会产生意外的结果。 - Martin Marconcini
@MartinMarconcini,我们已经有了 android:maxLines="1",所以我认为将 layout_height="wrap_content" 设置为正确的方式,并且它运行良好。 - Linh
@PhanVanLinh 我在嵌套滚动视图+RecyclerView的情况下也遇到了相同的问题。也许它适用于某些情况,但要小心使用。实际上,文档中提到了“意外结果”,所以这一点并不是非常清楚。我的情况确实是出乎意料的。 - Martin Marconcini

3
除了为单行TextView添加自适应大小属性之外,我还必须添加textSize属性,以便高度能够自适应到足够大,从而使文本可以调整到其定义的最大尺寸。
android:lines="1"
android:maxLines="1"
android:textSize="30sp"
app:autoSizeMaxTextSize="30sp"
app:autoSizeMinTextSize="12sp"
app:autoSizeTextType="uniform"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接