[android] Textview的autosize 与 wrap_content 属性混用的问题

879 阅读1分钟

TextView 的 autosize 功能不应该与 wrap_content 特性混用, 这在官方的文档中就说明了

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

这里复现了一个例子, TextView的布局空间会发生跳变(真实的场景比这里更复杂, 我做了最小可复现的简化)

width-change.gif

部分布局如下:

<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时的宽高如下: p1.png

p2.png

设置了autosize的textview比普通view宽高都更大

按键代码如下:

findViewById<Button>(R.id.set_txt).setOnClickListener {
    textView?.requestLayout()
}

点击按钮就requestLayout一下, 在requestLayout之后宽高变为正常

p3.png

在页面layout完成后,TextView会获得一个比wrap_content更大的布局空间,
异步触发一次requestLayout后会重新measure, 在这次measurewrap_content属性生效,就会将空间缩小成实际需要的空间