Android中TextView实现超过固定行数显示“...展开全部”
主要给大家介绍了关于Android中TextView如何实现超过固定行数显示"...展开全部"的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。 在Android开发中,TextView是用于显示文本的基本组件。在某些场景下,我们可能希望限制TextView显示的文本行数,当内容超过预设行数时,显示一个“...展开全部”的提示,供用户点击查看全部内容。这篇教程将详细介绍如何实现这一功能。 要实现TextView的多行显示并自动截断,可以使用`android:maxLines`属性来指定最大行数,同时配合`android:ellipsize`属性来设置省略号显示。例如,以下XML布局文件中的TextView配置将限制最多显示两行,超出部分使用省略号表示: ```xml <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:maxLines="2" android:ellipsize="end" /> ``` 然而,上述方法仅实现了简单的文本截断,无法提供“展开全部”的功能。为了实现这一功能,我们需要自定义一个工具类,通过监听TextView的布局变化来动态调整文本内容。以下是一个实现该功能的工具类示例: ```java public class TextViewUtil { public static void toggleEllipsize(Context context, final TextView textView, final int minLines, final String originText, final String endText, final int endColorID, final boolean isExpand) { if (TextUtils.isEmpty(originText)) { return; } textView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (isExpand) { textView.setText(originText); } else { int paddingLeft = textView.getPaddingLeft(); int paddingRight = textView.getPaddingRight(); TextPaint paint = textView.getPaint(); float moreText = textView.getTextSize() * endText.length(); float availableTextWidth = (textView.getWidth() - paddingLeft - paddingRight) * minLines - moreText; CharSequence ellipsizeStr = TextUtils.ellipsize(originText, paint, availableTextWidth, TextUtils.TruncateAt.END); if (ellipsizeStr.length() < originText.length()) { CharSequence temp = ellipsizeStr + endText; SpannableStringBuilder ssb = new SpannableStringBuilder(temp); ssb.setSpan(new ForegroundColorSpan(context.getResources().getColor(endColorID)), temp.length() - endText.length(), temp.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); textView.setText(ssb); } else { textView.setText(originText); } } if (Build.VERSION.SDK_INT >= 16) { textView.getViewTreeObserver().removeOnGlobalLayoutListener(this); } else { textView.getViewTreeObserver().removeGlobalOnLayoutListener(this); } } }); } } ``` 在这个工具类中,`toggleEllipsize`方法接受多个参数,包括上下文、TextView对象、最小行数、原始文本、结束文本(如“...展开全部”)、结束文本的颜色ID以及当前是否处于展开状态。在布局完成后,会根据`isExpand`判断是显示完整文本还是截断后的文本。截断时,计算可用的宽度,使用`TextUtils.ellipsize`进行截断,并在末尾添加结束文本,同时设置结束文本的颜色。 为了使TextView能够响应点击事件并切换展开/收起状态,还需要添加一个点击监听器: ```java textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 获取当前是否展开 boolean isExpanded = ...; // 可以使用SharedPreferences存储状态 // 调用toggleEllipsize方法,切换状态 TextViewUtil.toggleEllipsize(getContext(), textView, minLines, originText, endText, endColorID, !isExpanded); // 更新状态 isExpanded = !isExpanded; // 存储状态 ... } }); ``` 这样,当用户点击TextView时,就会切换文本的显示状态,实现“展开全部”的功能。这个功能在很多应用中都非常实用,比如在列表项中显示简介或者评论,可以提高用户体验,避免过长的文本占用过多屏幕空间。























- 粉丝: 3
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- update9-20250731.5.209.slice.img.7z.001.pd
- 基于COMSOL仿真的光学波导传输技术研究:光纤波导三维弯曲、模场分布及损耗分析
- 基于距离和方位的多智能体编队分布式控制:原理、仿真与稳定性分析 - 多智能体系统
- 基于MATLAB Simulink的高频隔离DAB-双有源全桥DC-DC变换器仿真模型,实现电压电流双闭环与ZVS软开关,功率双向流动的学习交流使用 MATLAB
- 基于S7-200 PLC和MCGS组态的灌装贴标生产线系统解析 梯形图程序、接线图原理图和组态画面
- CarSim与Simulink联合仿真实现基于MPC的超车换道路径动态规划及实时检测
- Django框架多模态知识图谱智能旅游推荐系统Python源码SQL数据库详细注释毕设新项目
- 崔帕斯T1080电脑调音软件下载
- AI辅导员问答信息word文档
- 番茄钟html版的源码
- update9-20250731.5.209.slice.img.7z.002
- 基于 OpenMV 和 STM32 的循迹小车
- 崔帕斯T1980电脑调音软件下载
- 基于COMSOL仿真的光学手性BIC在光子晶体板中的连续域束缚态及琼斯矩阵透射谱分析
- 电力电子领域LLC谐振变换器Simulink仿真的电压电流双环竞争控制策略及其实现 LLC谐振变换器 说明


