为什么Android TextView设置addTextChangedListener后setEllipsize与setMaxLines失效
问题成因
- 核心触发点是你调用
setText时指定了TextView.BufferType.SPANNABLE,当TextView已经添加TextWatcher时,可编辑的Editable/Spannable类型内容会触发系统原生逻辑覆盖原有配置:为了保证后续文本修改时布局能正常更新,Android 会自动关闭setMaxLines与setEllipsize的组合效果,避免省略号截断后文本修改出现布局异常。 - 次要影响因素是你给TextView设置了
android:layout_width="wrap_content",文本宽度计算时会优先适配内容长度,进一步降低了省略号触发的准确性。
可行解决方法
按业务适配成本从低到高排序:
- 移除
setText的特殊BufferType配置
默认setText使用BufferType.NORMAL即可避免该问题,修改onResume中的相关代码:
@Override protected void onResume() { super.onResume(); String text = "The annual Apple new product launch conference is here again. Although the basic information was revealed before the launch event as in previous years"; // 去掉BufferType参数即可 tv.setText(text); }
- 文本变更后重新配置省略规则
如果业务确实需要使用Spannable能力,可在afterTextChanged回调末尾重新配置行数和省略规则,覆盖系统自动修改的参数:
@Override public void afterTextChanged(Editable s) { Log.i(TAG,"afterTextChanged s:"+s.toString()); // 重新添加配置 tv.setMaxLines(3); tv.setEllipsize(TextUtils.TruncateAt.END); }
- 布局层面优化触发逻辑
可以在XML布局中直接配置省略和行数规则,同时将TextView宽度改为固定值或者match_parent,提升省略计算的稳定性:
<TextView android:id="@+id/tv_test" android:layout_width="match_parent" android:layout_height="wrap_content" android:maxLines="3" android:ellipsize="end" android:textSize="25sp" />
内容的提问来源于stack exchange,提问作者Damon
相关产品推荐
相关产品推荐

