解决TextView中MaxLines与ellipsize=end冲突问题
2016-04-13 10:01
447 查看
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);
}
}
以上只是相关的方法代码,传入相应的参数就可以了。
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);
}
}
以上只是相关的方法代码,传入相应的参数就可以了。
相关文章推荐
- 线程,进程,应用程序域的关系图
- 【Zookeeper】JAVA通过ZK实现服务注册和服务发现
- 启动loadrunner web server报1080端口占用的解决方法
- [置顶] 算法导论学习:插入排序法的实现
- Nginx配置SSL证书部署HTTPS网站
- 史上最全设计模式导学目录(完整版)
- Python一日一练14----希尔排序
- cocos2d:CCScale9Sprite char bubble
- android笔记
- openwrt增加串口登录需要密码
- golang 字符串操作实例
- ZOJ 3870 Team Formation(二进制找规律)
- ListView定焦&滑动效果
- 递归树形菜单
- QT安装过程中报错无法定位程序输入点except1 于动态链接库MSVCR120D dll上
- windows 7 下,如何统计某文件夹下 视频总时长
- 开发人员必备的几款bug管理工具
- 第二章 Spring MVC入门 —— 跟开涛学SpringMVC
- WCF、WebAPI、WCFREST、WebService之间的区别
- Mysql_install_db相关介绍