android 决TextView中MaxLines与ellipsize=end冲突问题
16lz
2022-01-02
今天,讲讲如何在多行文本后显示省略号。
TextView控件有一个属性是ellipsize,指的是当文字内容长度超过TextView大小时显示问题,一般情况下我们都是用省略号表示,常用的情况有以下四种:
1,Android:ellipsize = "end" 省略号在结尾
3,android:ellipsize = "start" 省略号在开头
3,android:ellipsize = "middle" 省略号在中间
4,android:ellipsize = "marquee" 跑马灯
但是我们遇到的问题是,这几个属性一般只有在设置了android:singleline = "true"的时候才有效,此时只能显示一行文字,但是当我们的TextView要显示多行文字,比如我们设置了android:maxLines="3"时,我们肯定不能设置android:singleline = "true",此时的android:ellipsize=“end”就失去效果了。MaxLines与ellipsize=end冲突问题纠结我很久,在网上打了不少资料,加上自己工作中的实际情况,写了个工具类,测试了好几款手机都没有问题,把主要代码贴出来,请大家多指教!
/** * 参数:maxLines 要限制的最大行数 * 参数:content 指TextView中要显示的内容 */ public void setMaxEcplise(final TextView mTextView, final int maxLines, final String content) {ViewTreeObserver observer = mTextView.getViewTreeObserver(); observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { mTextView.setText(content); if (mTextView.getLineCount() > maxLines) { int lineEndIndex = mTextView.getLayout().getLineEnd(maxLines - 1); //下面这句代码中:我在项目中用数字3发现效果不好,改成1了
String text = content.subSequence(0, lineEndIndex - 3) + "..."; mTextView.setText(text); } else { removeGlobalOnLayoutListener(mTextView.getViewTreeObserver(), this); } } }); }
@SuppressWarnings("deprecation") @SuppressLint("NewApi") private void removeGlobalOnLayoutListener(ViewTreeObserver obs, OnGlobalLayoutListener listener) { if (obs == null) return; if (Build.VERSION.SDK_INT < 16) { obs.removeGlobalOnLayoutListener(listener); } else { obs.removeOnGlobalLayoutListener(listener); } }
以上只是相关的方法代码,传入相应的参数就可以了
这个其实很简单,只是判断文档数是否大于3行,如果大于,则只显示3行的文本,然后加入省略号。
android 决TextView中MaxLines与ellipsize=end冲突问题就讲完了。
就这么简单。
更多相关文章
- 手动滑动TextView超出的内容
- android读取sqlite数据库的数据并用listview显示
- Android之Adapter用法总结
- Android软键盘的显示与隐藏
- 【Android】Android中不同手机分辨率适配问题
- Android(安卓)项目开发填坑记 - 使用 MultiDex 解决 64K 限制
- 对android里布局文件当中的TextView对象设置事件监听,但是不响应
- Android之Adapter用法总结
- Android中利用GridView实现水平和垂直均有滚动条的表格效果