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
,原理是一样的。
您应该同时具有有界宽度和高度,这意味着每个维度都属于以下之一:
您已指定该尺寸(宽度或高度)的绝对值
您已将约束设置为两个方向
例如:
更新:(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:maxLines
或 android:lines
不 阻碍 TextView
相应调整大小,singleLine
属性(当设置为 true 时)完全禁用任何自动调整大小。
因此,在追踪 AutoTextSize 问题时,首先尝试搜索 singleLine
属性,因为它有时会在扩展 Button
.
时被继承
确保检查这些选项以便 autoSize 工作:
- 不要在任何维度(例如
layout_width
和layout_height
)中使用wrap_content
- 确保不要使用
singleLine
,而是使用 android:maxLines
- 使用
app:autosizexxx
而不是 android:autosizexxx
以支持旧的 android 版本
- Autosize 在
AppCompatTextView
和 TextView
中均有效,因此您无需更改视图
除了单行的自动调整大小属性 TextView
我还必须添加 textSize
,所以换行的高度足够大,可以让文本调整到它定义的最大大小
android:lines="1"
android:maxLines="1"
android:textSize="30sp"
app:autoSizeMaxTextSize="30sp"
app:autoSizeMinTextSize="12sp"
app:autoSizeTextType="uniform"
我使用支持库 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
,原理是一样的。
您应该同时具有有界宽度和高度,这意味着每个维度都属于以下之一:
您已指定该尺寸(宽度或高度)的绝对值
您已将约束设置为两个方向
例如:
更新:(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:maxLines
或 android:lines
不 阻碍 TextView
相应调整大小,singleLine
属性(当设置为 true 时)完全禁用任何自动调整大小。
因此,在追踪 AutoTextSize 问题时,首先尝试搜索 singleLine
属性,因为它有时会在扩展 Button
.
确保检查这些选项以便 autoSize 工作:
- 不要在任何维度(例如
layout_width
和layout_height
)中使用wrap_content
- 确保不要使用
singleLine
,而是使用android:maxLines
- 使用
app:autosizexxx
而不是android:autosizexxx
以支持旧的 android 版本 - Autosize 在
AppCompatTextView
和TextView
中均有效,因此您无需更改视图
除了单行的自动调整大小属性 TextView
我还必须添加 textSize
,所以换行的高度足够大,可以让文本调整到它定义的最大大小
android:lines="1"
android:maxLines="1"
android:textSize="30sp"
app:autoSizeMaxTextSize="30sp"
app:autoSizeMinTextSize="12sp"
app:autoSizeTextType="uniform"