51

我使用支持库 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。我有不同长度的文本,我想将这些文本设置为 this TextView。它应该自动调整大小,以便以最大可能显示整个文本(所有字符+未裁剪)textSize

这是我的文本视图:

<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" />

不幸的是,文本视图被裁剪了。我想将此字符串设置为上面 TextView 的文本:“Groupa”,但结果如下: 在此处输入图像描述

(TextView 位于带有黄色圆圈背景的 ConstraintLayout 内。)

如您所见,textview 根本没有调整大小。你知道该怎么做吗?

谢谢。

4

12 回答 12

57

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

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

于 2018-02-12T13:38:16.610 回答
55

我已经针对几种情况对此进行了测试,并得出以下结论:

您必须具有有限的宽度高度。例如,如果您将宽度设置为match_parentwrap_content高度,我认为 Android 不知道您想要将文本拉伸到多高。在您的示例中,您没有特定的高度,所以我认为这就是它不起作用的原因。

例如:

包装文本的内容高度

文本的特定高度

不知道为什么Android官方文档会以wrap_content为例...

如您所见,我在示例中没有使用其他属性,因此这可能不是属性不正确的问题。

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

只要您使用支持库 26.0.0 或更高版本就足够了。

编辑:

至于ConstraintLayout,校长是一样的。您应该同时具有有界的宽度和高度,这意味着每个维度的以下任一维度:

  1. 您已为该尺寸(宽度或高度)指定了绝对值

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

例如:

所有 4 个方向都受到约束 高度设置为绝对值 宽度设置为绝对值

更新:(2017-09-21)

我已经测试过,不幸的是它似乎还不支持自定义字体,这是一个在支持库 v26 中一起发布的函数......

于 2017-08-18T17:52:08.970 回答
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"/>
于 2017-08-09T14:42:55.080 回答
9

您将哪个值设置为 android:layout_height 属性?

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

我还在这里创建了一个关于Autosizing TextView的教程。

于 2017-09-05T09:34:39.583 回答
6

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

于 2018-02-15T00:24:25.423 回答
6

@Sira Lam 接受的答案的附加信息:

始终确保您不继承可能与 AutoTextSize 的行为冲突的属性,尤其是android:singleLine.

即使android:maxLinesandroid:lines 相应地阻止TextView调整大小,该singleLine属性(当设置为 true 时)也会完全禁用任何自动调整大小。

因此,在追踪 AutoTextSize 问题时,首先尝试搜索singleLine属性,因为它有时会在扩展Button.

于 2019-08-12T10:40:57.297 回答
5

确保检查这些选项以自动调整大小

  • 不要wrap_content在任何维度中使​​用(例如layout_widthlayout_height
  • 确保不使用singleLine,而是使用android:maxLines
  • 使用app:autosizexxx代替android:autosizexxx以支持较旧的 android 版本
  • Autosize 适用于AppCompatTextViewTextView,因此您无需更改视图
于 2020-09-25T08:19:38.873 回答
3

您是否尝试过设置您发布的链接中描述的所有四个属性?

例如

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

您也可以尝试将宽度和高度都设置为 wrap_content,并将 minWidth 和 maxWidth 设置为 56dp。

正如评论中还提到的那样,maxlines 似乎会导致问题(对我来说也是如此),所以请尝试删除它(自动调整大小应该可以通过减少文本大小来解决这个问题)。

于 2017-07-06T14:44:50.567 回答
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 上运行良好
在此处输入图像描述

于 2017-09-08T09:49:15.617 回答
1

如果您不知道 textview 的大小。例如,您将它们放在线性布局中并将高度或宽度设置为 0dp。然后我得到了解决方案。您需要在 OnSizeChanged 事件中设置 AutoSizeTextTypeWithDefaults。

@Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        this.setAutoSizeTextTypeWithDefaults(AUTO_SIZE_TEXT_TYPE_UNIFORM);

    }
于 2017-09-27T06:03:07.280 回答
1

android:maxLines=1确保按照@Henning 所说的那样使用。

<androidx.appcompat.widget.AppCompatTextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:textColor="@color/white"
            android:textSize="16sp"
            android:textStyle="bold"

            android:maxLines="1"
            app:autoSizeMaxTextSize="16sp"
            app:autoSizeMinTextSize="12sp"
            app:autoSizeTextType="uniform"

            tools:text="Downloading" />
于 2019-06-28T09:04:30.540 回答
0

除了单行的自动调整大小属性外,TextView我还必须添加textSize,所以换行的高度足够大,可以让文本调整到定义的最大大小

android:lines="1"
android:maxLines="1"
android:textSize="30sp"
app:autoSizeMaxTextSize="30sp"
app:autoSizeMinTextSize="12sp"
app:autoSizeTextType="uniform"
于 2021-04-15T10:20:34.733 回答