You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么Android TextView设置addTextChangedListener后setEllipsize与setMaxLines失效

问题成因
  • 核心触发点是你调用setText时指定了TextView.BufferType.SPANNABLE,当TextView已经添加TextWatcher时,可编辑的Editable/Spannable类型内容会触发系统原生逻辑覆盖原有配置:为了保证后续文本修改时布局能正常更新,Android 会自动关闭setMaxLines与setEllipsize的组合效果,避免省略号截断后文本修改出现布局异常。
  • 次要影响因素是你给TextView设置了android:layout_width="wrap_content",文本宽度计算时会优先适配内容长度,进一步降低了省略号触发的准确性。
可行解决方法

按业务适配成本从低到高排序:

  1. 移除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);
}
  1. 文本变更后重新配置省略规则
    如果业务确实需要使用Spannable能力,可在afterTextChanged回调末尾重新配置行数和省略规则,覆盖系统自动修改的参数:
@Override
public void afterTextChanged(Editable s) {
    Log.i(TAG,"afterTextChanged s:"+s.toString());
    // 重新添加配置
    tv.setMaxLines(3);
    tv.setEllipsize(TextUtils.TruncateAt.END);
}
  1. 布局层面优化触发逻辑
    可以在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 19:54:05