序言:在日常开发中,业务提出了一个需求需要文本显示不下最多显示两行 并且在第二行末尾用省略号表示显示不下,还要接上一个图标 图标可以点击弹窗显示所有文字内容效果如下:
问题: 1、文本固定显示两行并且在末尾用省略号代替 2、末尾跟随可点击的图标
实现思路 1、首先末尾省略号我采取的是获取每一行的字数,然后根据需要展示的行数 累计 最后替换字符串 2、文本末尾跟上图标我们可以用SpannableStringBuilder 实现
获取每一行字数
Layout layout = textView.getLayout();
//获取textview的行数
int lineCount = layout.getLineCount();
if (lineCount == 0) {
return;
}
if (StringUtils.isEmpty(text)) {
return;
}
String result = "";
//lineEnd表示某一行最后一个字的下标记
int lineEnd = 0;
if (lineCount == 1) {
lineEnd = layout.getLineEnd(0);
} else if (lineCount >= 2) {
lineEnd = layout.getLineEnd(1);
}
if (lineEnd > 2) {
result = text.substring(0, lineEnd - 2);
}
省略号
SpannableStringBuilder spannableString = new SpannableStringBuilder();
spannableString.clear();
spannableString.append(result).append("... ");
跟上图标
//也可以这样
Drawable drawable = BaseApplication.getContext().getResources().getDrawable(icon);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
ImageSpan imageSpan1 = new ImageSpan(drawable);
spannableString.setSpan(imageSpan1, spannableString.length() - 2, spannableString.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(clickableSpan, spannableString.length() - 2, spannableString.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);
图标可以点击需要用到clickableSpan 注意要想点击还必须设置
textView.setMovementMethod(LinkMovementMethod.getInstance());
//设置这个是为了在点击时没有按下效果
textView.setHighlightColor(BaseApplication.getContext().getResources().getColor(android.R.color.transparent));
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View view) {
//弹窗显示全部的文字内容 ,这儿根据需求不同可以不同处理
OldUtils.getInstance().showWarn(text, title, context);
}
@Override
public void updateDrawState(@androidx.annotation.NonNull TextPaint ds) {
super.updateDrawState(ds);
ds.setColor(BaseApplication.getContext().getResources().getColor(android.R.color.transparent));
}
};
最后附上完整代码
/**
* 用于textview 展示超出两行显示...并且在后面跟上图标
*@param textview 展示内容的textview
*@param icon 末尾图标
*@param text 展示的内容
*@param title 弹窗上需要展示的标题 没有可以不传
*@param context 上下文
*/
public void setTextLineWithIcon(final TextView textView, final int icon, final String text, final String title
, final Context context) {
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.post(new Runnable() {
@Override
public void run() {
Layout layout = textView.getLayout();
int lineCount = layout.getLineCount();
if (lineCount == 0) {
return;
}
if (StringUtils.isEmpty(text)) {
return;
}
String result = "";
int lineEnd = 0;
if (lineCount == 1) {
lineEnd = layout.getLineEnd(0);
} else if (lineCount >= 2) {
//当行数大于等于两行时取第二行末尾的下标 如果需要在第三行接图标可以用layout.getLineEnd(2); 这儿注意判断行数是否大于三行 不然这样取会崩溃
lineEnd = layout.getLineEnd(1);
}
if (lineEnd > 2) {
result = text.substring(0, lineEnd - 2);
}
SpannableStringBuilder spannableString = new SpannableStringBuilder();
spannableString.clear();
spannableString.append(result).append("... ");
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View view) {
//图标点击事件 根据需求不同 逻辑不同
OldUtils.getInstance().showWarn(text, title, context);
}
@Override
public void updateDrawState(@androidx.annotation.NonNull TextPaint ds) {
super.updateDrawState(ds);
ds.setColor(BaseApplication.getContext().getResources().getColor(android.R.color.transparent));
}
};
//也可以这样
Drawable drawable = BaseApplication.getContext().getResources().getDrawable(icon);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
ImageSpan imageSpan1 = new ImageSpan(drawable);
spannableString.setSpan(imageSpan1, spannableString.length() - 2, spannableString.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(clickableSpan, spannableString.length() - 2, spannableString.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);
textView.setHighlightColor(BaseApplication.getContext().getResources().getColor(android.R.color.transparent));
}
});
}
文末
如果要想成为Android架构师,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。
如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。
一、架构师筑基必备技能
1、深入理解Java泛型
2、注解深入浅出
3、并发编程
4、数据传输与序列化
5、Java虚拟机原理
6、高效IO
……
二、Android百大框架源码解析
1.Retrofit 2.0源码解析
2.Okhttp3源码解析
3.ButterKnife源码解析
4.MPAndroidChart 源码解析
5.Glide源码解析
6.Leakcanary 源码解析
7.Universal-lmage-Loader源码解析
8.EventBus 3.0源码解析
9.zxing源码分析
10.Picasso源码解析
11.LottieAndroid使用详解及源码解析
12.Fresco 源码分析——图片加载流程
三、Android性能优化实战解析
- 腾讯Bugly:对字符串匹配算法的一点理解
- 爱奇艺:安卓APP崩溃捕获方案——xCrash
- 字节跳动:深入理解Gradle框架之一:Plugin, Extension, buildSrc
- 百度APP技术:Android H5首屏优化实践
- 支付宝客户端架构解析:Android 客户端启动速度优化之「垃圾回收」
- 携程:从智行 Android 项目看组件化架构实践
- 网易新闻构建优化:如何让你的构建速度“势如闪电”?
- …
四、高级kotlin强化实战
1、Kotlin入门教程
2、Kotlin 实战避坑指南
3、项目实战《Kotlin Jetpack 实战》
-
从一个膜拜大神的 Demo 开始
-
Kotlin 写 Gradle 脚本是一种什么体验?
-
Kotlin 编程的三重境界
-
Kotlin 高阶函数
-
Kotlin 泛型
-
Kotlin 扩展
-
Kotlin 委托
-
协程“不为人知”的调试技巧
-
图解协程:suspend
五、Android高级UI开源框架进阶解密
1.SmartRefreshLayout的使用
2.Android之PullToRefresh控件源码解析
3.Android-PullToRefresh下拉刷新库基本用法
4.LoadSir-高效易用的加载反馈页管理框架
5.Android通用LoadingView加载框架详解
6.MPAndroidChart实现LineChart(折线图)
7.hellocharts-android使用指南
8.SmartTable使用指南
9.开源项目android-uitableview介绍
10.ExcelPanel 使用指南
11.Android开源项目SlidingMenu深切解析
12.MaterialDrawer使用指南
六、NDK模块开发
1、NDK 模块开发
2、JNI 模块
3、Native 开发工具
4、Linux 编程
5、底层图片处理
6、音视频开发
7、机器学习
七、Flutter技术进阶
1、Flutter跨平台开发概述
2、Windows中Flutter开发环境搭建
3、编写你的第一个Flutter APP
4、Flutter开发环境搭建和调试
5、Dart语法篇之基础语法(一)
6、Dart语法篇之集合的使用与源码解析(二)
7、Dart语法篇之集合操作符函数与源码分析(三)
…
八、微信小程序开发
1、小程序概述及入门
2、小程序UI开发
3、API操作
4、购物商场项目实战……
全套视频资料:
一、面试合集
二、源码解析合集
三、开源框架合集
欢迎大家一键三连支持,若需要文中资料,直接点击文末优快云官方认证微信卡片免费领取【保证100%免费】↓↓↓