Android中设置长文本后如何获取AppCompatTextView的正确调整字号?
解决AppCompatTextView自动调整字号后获取正确字号的问题
这个坑我之前踩过好几次!你遇到的问题本质是:AppCompatTextView的自动调整字号逻辑是在布局绘制阶段才完成的,如果直接在onCreate/onViewCreated这类早期生命周期方法里调用getTextSize(),拿到的只会是你XML里设置的初始字号(比如你写的30sp),而不是文本超出宽度后自动缩小的实际字号。
下面给你两种靠谱的解决方法:
方法1:用ViewTreeObserver监听布局完成
通过监听View的全局布局事件,确保在控件完成布局和字号调整后再获取值:
val textView = findViewById<AppCompatTextView>(R.id.textview1) textView.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { override fun onGlobalLayout() { // 记得移除监听,避免重复触发 textView.viewTreeObserver.removeOnGlobalLayoutListener(this) // 获取实际字号(注意返回值是px单位) val actualSizePx = textView.textSize // 转换为sp单位,和XML里的单位对应 val actualSizeSp = actualSizePx / resources.displayMetrics.scaledDensity // 这里就可以拿到正确的自动调整后的字号了 Log.d("TextViewSize", "实际字号:${String.format("%.1f", actualSizeSp)}sp") } })
方法2:使用OnLayoutChangeListener
这种方式更直接,监听控件自身的布局变化:
val textView = findViewById<AppCompatTextView>(R.id.textview1) textView.addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ -> // 移除监听,防止重复回调 textView.removeOnLayoutChangeListener(this) val actualSizePx = textView.textSize val actualSizeSp = actualSizePx / resources.displayMetrics.scaledDensity Log.d("TextViewSize", "实际字号:${String.format("%.1f", actualSizeSp)}sp") }
额外注意点
- 如果你的文本是动态更新的(比如后续会改变text内容),不要移除监听,或者在每次更新文本后重新添加监听,但要注意在页面销毁时移除监听避免内存泄漏。
getTextSize()返回的是像素值,必须除以resources.displayMetrics.scaledDensity才能转换成我们熟悉的sp单位。
内容的提问来源于stack exchange,提问作者ldt25290
相关产品推荐
相关产品推荐

