TextView的自动调整功能不起作用(Android O)

时间:2017-05-22 16:35:49

标签: android textview android-support-library autosize android-8.0-oreo

我使用支持库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。我有不同长度的文本,我想将这些文本设置为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" />

不幸的是,文本视图被裁剪了。我想将此String设置为上面TextView的文本:&#34; Groupa&#34;但这是结果: enter image description here

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

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

感谢。

12 个答案:

答案 0 :(得分:37)

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

您必须具有有界宽度高度。例如,如果您将宽度设置为match_parent,但将wrap_content设置为高度,我认为Android并不知道您希望拉伸文本的高度。在你的例子中,你没有特定的高度,所以我认为这就是为什么它不起作用。

例如:

wrap content height for a text

specific height for a text

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

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

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

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

修改

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

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

  2. 您已将约束设置为双向

  3. 例如:

    All 4 directions are constrained Height set to be an absolute value Width set to be an absolute value

    更新:(2017-09-21)

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

答案 1 :(得分:32)

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

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

答案 2 :(得分:8)

我有同样的问题。 我通过改变我的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"/>

答案 3 :(得分:5)

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

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

答案 4 :(得分: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

答案 5 :(得分:3)

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

答案 6 :(得分:2)

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

E.g。

public class UserRequestModel {
  public List<User> Users { get; set; }
  public List<Request> Requests { get; set; }
}

您还可以尝试将width和height设置为wrap_content,并将minWidth和maxWidth设置为56dp。

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

答案 7 :(得分:1)

如果你不知道textview的大小。例如你把它们放在linearlayout中并将高度或宽度设置为0dp。然后我得到了解决方案。你需要在OnSizeChanged事件中设置setAutoSizeTextTypeWithDefaults。

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

    }

答案 8 :(得分:1)

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

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

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

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

答案 9 :(得分:0)

确保使用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" />

答案 10 :(得分:0)

请确保选中以下选项以使 autoSize 起作用:

  • 请勿在任何尺寸(例如wrap_contentlayout_width)中使用layout_height
  • 请确保不要使用singleLine,而要使用android:maxLines
  • 使用app:autosizexxx代替android:autosizexxx来支持较早的android版本
  • 自动调整大小在AppCompatTextViewTextView中均有效,因此您无需更改视图

答案 11 :(得分:0)

除了单行 TextView 的 autosize 属性之外,我还必须添加 textSize,因此环绕的高度足够大,可以让文本调整到定义的最大大小

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