搜索
您的当前位置:首页正文

Android textview 文字显示不下用省略号代替 并且接图标 ,图标可点击

来源:步旅网

序言:在日常开发中,业务提出了一个需求需要文本显示不下最多显示两行 并且在第二行末尾用省略号表示显示不下,还要接上一个图标 图标可以点击弹窗显示所有文字内容效果如下:

问题: 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、购物商场项目实战……

全套视频资料:

一、面试合集

二、源码解析合集


三、开源框架合集

因篇幅问题不能全部显示,请点此查看更多更全内容

Top