TextView设置maxLength后ellipsize不生效,如何兼顾字符限制与省略显示?
我明白你遇到的困扰了:给TextView设置android:maxLength="22"后,原本的android:ellipsize="end"省略号功能就失效了。这其实是两个属性的作用逻辑冲突导致的,我来给你拆解原因并提供可行的解决方案:
问题根源
android:maxLength的作用是直接将文本截断到指定字符数——哪怕原文本更长,最终显示的内容也只会保留前22个字符。而android:ellipsize="end"是当文本超出TextView的显示宽度时,才会在末尾显示省略号。如果22个字符刚好能在你的TextView宽度内完全显示,自然不会触发省略号效果,这就是你看不到省略号的核心原因。
解决方案
要实现「文本超过22字符时显示省略号,且最终显示内容(含省略号)不超过22字符」的需求,你需要去掉android:maxLength,改用代码手动处理文本,具体步骤如下:
1. 修改XML布局
先把vh_fragnotifications_postedby的android:maxLength="22"属性移除,保留其他必要配置:
<TextView android:id="@+id/vh_fragnotifications_postedby" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="12sp" android:layout_marginTop="8dp" android:text="zz12345678901234567890aaa" app:layout_constraintTop_toBottomOf="@+id/vh_fragnotifications_body" app:layout_constraintLeft_toLeftOf="@+id/vh_fragnotifications_body" app:layout_constraintRight_toLeftOf="@+id/vh_fragnotifications_dateposted" android:ellipsize="end" android:maxLines="1"/>
2. 代码处理文本
在你的Activity、Fragment或者ViewHolder中,对要显示的文本做判断:如果原文本长度超过22,就截取前19个字符加上省略号(省略号占3个字符位置),否则直接显示原文本:
Kotlin版本
val originalText = "zz12345678901234567890aaaaaaaa" val maxDisplayLength = 22 val targetTextView = findViewById<TextView>(R.id.vh_fragnotifications_postedby) // 或用ViewBinding简化 targetTextView.text = if (originalText.length > maxDisplayLength) { originalText.substring(0, maxDisplayLength - 3) + "..." } else { originalText }
Java版本
String originalText = "zz12345678901234567890aaaaaaaa"; int maxDisplayLength = 22; TextView targetTextView = findViewById(R.id.vh_fragnotifications_postedby); if (originalText.length() > maxDisplayLength) { String truncatedText = originalText.substring(0, maxDisplayLength - 3) + "..."; targetTextView.setText(truncatedText); } else { targetTextView.setText(originalText); }
额外说明
如果你不需要严格限制字符数,只是希望文本超出TextView宽度时自动显示省略号,那只需要保留android:ellipsize="end"和android:maxLines="1",去掉android:maxLength即可——这种情况下,TextView会根据自身宽度自动截断并显示省略号,适配不同屏幕的显示需求。
内容的提问来源于stack exchange,提问作者WHOATEMYNOODLES

