Android中TextView多行文本省略功能失效如何解决?
Android TextView多行文本省略失效的解决方案
在Android开发中,设置TextView多行文本省略时可能出现功能失效的情况,比如以下布局示例中,即便指定了maxLines="2",但ellipsize="none"导致无法自动触发多行省略,需要手动实现该效果:
<TextView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/spinner_item_text_view" style="@style/ControllerWidget.TextView.SpinnerDropDownItem" android:layout_width="match_parent" android:layout_height="wrap_content" android:ellipsize="none" android:gravity="center_vertical" android:maxLines="2" android:singleLine="false" />
解决方案思路
通过计算TextView的实际可用宽度、文本总宽度,得出文本实际占用行数,再调用TextUtils.ellipsize方法生成不会溢出的省略后字符串,具体实现如下:
fun ellipsize( textView: TextView, originText: CharSequence, maxLines: Int, truncateAt: TruncateAt ): CharSequence { // 计算左右drawable占用的宽度(上下drawable不影响水平宽度) val compoundDrawables = textView.compoundDrawables var compoundWidth = 0 if (compoundDrawables.isNotEmpty()) { compoundDrawables[0]?.let { compoundWidth += textView.compoundDrawablePadding + it.intrinsicWidth } if (compoundDrawables.size > 2) { compoundDrawables[2]?.let { compoundWidth += textView.compoundDrawablePadding + it.intrinsicWidth } } } // 计算文本可使用的宽度 val availableWidth = textView.width - textView.paddingEnd - textView.paddingStart - compoundWidth val textWidth = getMeasureText(textView, originText.toString()) // 计算文本实际占用的行数 val occupiedLines = (textWidth + availableWidth - 1).toInt() / availableWidth if (occupiedLines > 1) { // 取实际行数和最大行数的较小值 val resolvedLines = min(occupiedLines, maxLines) return TextUtils.ellipsize( originText, textView.paint, min(availableWidth * resolvedLines.toFloat(), textWidth), truncateAt ) } return originText } private fun getMeasureText(textView: TextView, text: String): Float { return textView.paint.measureText(text) }
使用说明
调用该方法时,传入目标TextView、原始文本、最大行数(如布局中的2行)以及省略位置(如TruncateAt.END),将返回值设置给TextView即可实现多行省略效果。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

