Android TextView 在最后一行末尾加图标

当前有个需求.显示一段文本,文本最多显示两行,点击展开后才显示完全。当没有显示完全的时候,需要在文本的第二行末尾显示图标,点击图标和文本,文本展开。

  难点在于图标需要和第二行文本显示在同一行,高度和文本一致,居中显示。看似简单  实则思路不好想。最后搞了两天,用html富文本解决。

当中涉及到英文换行的坑  然后涉及到汉字全角  半角导致布局问题的坑。

代码如下

布局文件:

<TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_margin="10dp"android:layout_height="match_parent"android:maxLines="2"android:ellipsize="end"android:breakStrategy="balanced"/>

Activity如下

package com.example.myapplication;import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.Html;
import android.text.Layout;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.style.ImageSpan;
import android.util.Log;
import android.view.Gravity;
import android.view.ViewTreeObserver;
import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {private String str = "我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱";private boolean isDeal = false;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TextView textView = findViewById(R.id.textView);textView.setText(toDBC(str));dealStr(textView);}public static String toDBC(String input) {char[] c = input.toCharArray();for (int i = 0; i < c.length; i++) {if (c[i] == 12288) {// 全角空格为12288,半角空格为32c[i] = (char) 32;continue;}if (c[i] > 65280 && c[i] < 65375)// 其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248c[i] = (char) (c[i] - 65248);}return new String(c);}private void dealStr(TextView textView) {// 在TextView绘制完成后获取省略的字符数ViewTreeObserver vto = textView.getViewTreeObserver();vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {textView.getViewTreeObserver().removeOnGlobalLayoutListener(this);if (isDeal) {return;}isDeal = true;int ellipsisCount = 0;Layout layout = textView.getLayout();if (layout != null) {int lineCount = layout.getLineCount();if (lineCount > 0) {int lastLineIndex = lineCount - 1;// 输出省略的字符数ellipsisCount = layout.getEllipsisCount(lastLineIndex);}}// 获取文本内容CharSequence fullText = textView.getText();if (ellipsisCount > 0) {// 截断发生// 获取截断后的文本CharSequence truncatedText = fullText.subSequence(fullText.length() - ellipsisCount, fullText.length());CharSequence un_truncatedText = fullText.subSequence(0, fullText.length() - ellipsisCount);String truncatedString = truncatedText.toString();replaceStr(textView, un_truncatedText.toString());} else {// 没有截断发生replaceStr(textView, textView.getText().toString());}}});}private void replaceStr(TextView textView, String tex) {SpannableStringBuilder builder = new SpannableStringBuilder();// 添加HTML文本内容String htmlText = "<html><body>" + tex + "</body></html>";builder.append(Html.fromHtml(htmlText));// 获取Drawable图标Drawable icon = getResources().getDrawable(R.drawable.expand_icon);icon.setBounds((int) textView.getTextSize(), 0, icon.getIntrinsicWidth() + (int) textView.getTextSize(), icon.getIntrinsicHeight());// 创建一个ImageSpan来显示图标ImageSpan iconSpan = new ImageSpan(icon, ImageSpan.ALIGN_CENTER);// 将ImageSpan添加到SpannableStringBuilder的末尾builder.setSpan(iconSpan, builder.length() - 2, builder.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);// 设置TextView的文本内容textView.setText(builder);// 垂直居中显示文本和图标textView.setGravity(Gravity.CENTER_VERTICAL);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/28297.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle 如何连同空表一起导出成dmp的方法

1、oracle导出dmp文件的时候&#xff0c;经常会出现一些空表&#xff0c;没有一并被导出的情况。 执行sql select alter table ||table_name|| allocate extent; from user_tables where num_rows0 or num_rows is null; 新建一个sql窗口&#xff0c;把查询结果的sql&#…

Pytorch自动求导机制详解

目录 1. 自动求导 1.1 梯度计算 1.1.1 一阶导数 1.1.2 二阶导数 1.1.3 向量 1.2 线性回归实战 1. 自动求导 在深度学习中&#xff0c;我们通常需要训练一个模型来最小化损失函数。这个过程可以通过梯度下降等优化算法来实现。梯度是函数在某一点上的变化率&#xff0c;可以告…

[黑苹果EFI]Lenovo ThinkPad T490电脑 Hackintosh 黑苹果引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板Lenovo ThinkPad T490 处理器Intel Intel Core i5 8265U (Quad Core)已驱动 内存16 GB:8 GB Samsung DDR 4 2666 Mhz *2已驱动 硬盘PC SN520 NVM…

CentOS7中安装docker并配置阿里云加速器

文章目录 一、docker的安装二、docker的卸载三、配置加速器四、docker-compose安装五、docker-compose卸载六、docker-compose相关命令七、常用shell组合 一、docker的安装 参考&#xff1a;https://docs.docker.com/engine/install/centos 本文内容是基于&#xff1a;CentOS L…

文件IO 文件属性获取,目录操作

文件属性获取 int stat(const char *path, struct stat *buf); 功能&#xff1a;获取文件属性参数&#xff1a; path&#xff1a;文件路径名 buf&#xff1a;保存文件属性信息的结构体返回值&#xff1a; 成功&#xff1a;0 失败&#xff1a;-1struct stat {ino_t st_ino;…

批发小程序怎么做

批发订货小程序功能介绍 我们的批发订货小程序是一个集订货浏览权限、一客一价、业务员端口、代客下单、订单汇总和订单打印等功能于一体的专业平台。以下是对这些功能的详细描述&#xff1a; 1. 订货浏览权限&#xff1a;我们的小程序可以为不同用户分配不同的订货浏览权限。…

在LLM的支持下使游戏NPC具有记忆化的方法

问题 使用GPT这样的LLM去处理游戏中的NPC和玩家的对话是个很好的点子&#xff0c;那么如何处理记忆化的问题呢。 因为LLM的输入tokens是有限制的&#xff0c;所以伴随着问题的记忆context是有窗口大小限制的&#xff0c;将所有的记忆输入LLM并不现实。 所以这里看到了stanfo…

TOWE智能PDU是如何帮助机房安然度夏的?

最近&#xff0c;全国各地纷纷进入高温“火炉”模式&#xff0c;炎炎夏日&#xff0c;数据中心的工作温度不应该超过一定的限度。数据中心机房不仅要确保在高温多雨天气下安全、稳定的运维&#xff0c;还要承受降低企业总体运营成本的压力。这种需求下&#xff0c;相较于传统基…

【Matlab】智能优化算法_遗传算法GA

【Matlab】智能优化算法_遗传算法GA 1.背景介绍2.数学模型3.文件结构4.详细代码及注释4.1 crossover.m4.2 elitism.m4.3 GeneticAlgorithm.m4.4 initialization.m4.5 Main.m4.6 mutation.m4.7 selection.m4.8 Sphere.m 5.运行结果6.参考文献 1.背景介绍 遗传算法&#xff08;Ge…

Python基础合集 练习28 (数值运算函数)

from this import d x -120 x的绝对值 x1 abs(x) 同时输出商和余数 y 7 y1 divmod(x1, y) print(y1) /进行幂余运算 z可以省略 (x**y)%z pow(x,y[,z]) pow(3, pow(3, 99), 10000) 四舍五入函数 d是保留小数位数&#xff0c;默认为0 round(x,[,d]) print(round…

uniapp安卓签名证书生成,签名证书的SHA1,SHA256,MD5获取

uniapp安卓证书生成有两种方式&#xff0c;一种是去dcloud开发者中心生成证书&#xff0c;另一种是安装jre环境&#xff0c;自己生成证书 第一种 dcloud生成证书 去该项目对应的应用处&#xff0c;生成证书需要等几分钟&#xff0c;生成后可以查看证书信息 第二种 自己生成…

05-1_Qt 5.9 C++开发指南_Model/View结构基础(基本原理;数据模型;试图组件;代理)

Model/View(模型/视图) 结构是 Qt 中用界面组件显示与编辑数据的一种结构&#xff0c;视图 (View)是显示和编辑数据的界面组件&#xff0c;模型 (Model) 是视图与原始数据之间的接口。Model/View 结构的典型应用是在数据库应用程序中&#xff0c;例如数据库中的一个数据表可以在…