TextView 的自动调整大小不起作用 (Android O)

Autosizing of TextView doesn't work (Android O)

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

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

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

app:autoSizeMaxTextSize="XXsp"

到目前为止一切顺利。假设我需要一个宽度为 56dp 的 TextView。我有不同长度的文本,我想将这些文本设置为此 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" />

很遗憾,文本视图被裁剪了。我想将此字符串设置为上面 TextView 的文本:"Groupa" 但这是结果:

(TextView 在 ConstraintLayout 里面,黄色圆圈背景。)

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

谢谢。

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

例如

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

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

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

我遇到了同样的问题。 我通过更改 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"/>

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

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

例如:

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

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

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

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

编辑:

至于ConstraintLayout,原理是一样的。 您应该同时具有有界宽度和高度,这意味着每个维度都属于以下之一:

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

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

例如:

更新:(2017-09-21)

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

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

From the document: "如果您在 XML 文件中设置自动调整大小,不建议将值 "wrap_content" 用于 layout_width或 TextView 的 layout_height 属性。它可能会产生意想不到的结果。"

我还创建了一个关于 Autosizing TextView here 的教程。

像这样配置你的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 日表现出色

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

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

    }

除了其他正确答案之外,我还发现了另一个阻止自动调整工作的问题。

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

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

确保按照@Henning 所说使用android:maxLines=1

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

@Sira Lam 接受的答案的补充信息:

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

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

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

时被继承

确保检查这些选项以便 autoSize 工作:

  • 不要在任何维度(例如layout_widthlayout_height)中使用wrap_content
  • 确保不要使用 singleLine,而是使用 android:maxLines
  • 使用 app:autosizexxx 而不是 android:autosizexxx 以支持旧的 android 版本
  • Autosize 在 AppCompatTextViewTextView 中均有效,因此您无需更改视图

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

android:lines="1"
android:maxLines="1"
android:textSize="30sp"
app:autoSizeMaxTextSize="30sp"
app:autoSizeMinTextSize="12sp"
app:autoSizeTextType="uniform"