TextView 的 autosize 功能不应该与 wrap_content 特性混用, 这在官方的文档中就说明了
注意:如果您在 XML 文件中设置自动调整大小,则不建议对 TextView 的 layout_width 或 layout_height 属性使用值“wrap_content”,否则可能会产生意外结果。
这里复现了一个例子, TextView的布局空间会发生跳变(真实的场景比这里更复杂, 我做了最小可复现的简化)
部分布局如下:
<LinearLayout
android:id="@+id/ctn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:autoSizeMinTextSize="8sp"
app:autoSizeTextType="uniform"
app:autoSizeMaxTextSize="12sp"
android:textColor="@android:color/holo_red_dark" />
<TextView
android:id="@+id/text2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp" />
</LinearLayout>
注意这里红色的TextView设置了autoText属性, 但设置了该属性的同时宽度和高度都是wrap_content
autoSizeMaxTextSize与后面正常大小textSize大小一致,
初始layout时的宽高如下:
设置了autosize的textview比普通view宽高都更大
按键代码如下:
findViewById<Button>(R.id.set_txt).setOnClickListener {
textView?.requestLayout()
}
点击按钮就requestLayout一下, 在requestLayout之后宽高变为正常
在页面layout完成后,TextView会获得一个比wrap_content更大的布局空间,
异步触发一次requestLayout后会重新measure, 在这次measure中wrap_content属性生效,就会将空间缩小成实际需要的空间