kotlin Android TextView显示部分文本,实现全文/展开和收起功能

时间: 2023-12-03 11:46:39 浏览: 19
可以使用以下代码实现TextView部分文本显示和展开/收起功能: ```kotlin class ExpandableTextView(context: Context, attrs: AttributeSet?) : TextView(context, attrs) { private var isExpanded: Boolean = false private var collapsedMaxLines: Int = 2 init { // 设置TextView默认的最大行数 maxLines = collapsedMaxLines // 设置TextView默认的Ellipsize ellipsize = TextUtils.TruncateAt.END // 设置TextView点击事件 setOnClickListener { toggle() } } /** * 设置TextView默认的最大行数 */ fun setCollapsedMaxLines(maxLines: Int) { this.collapsedMaxLines = maxLines this.maxLines = maxLines } /** * 切换TextView的展开/收起状态 */ private fun toggle() { isExpanded = !isExpanded setText(if (isExpanded) getFullText() else getCollapsedText()) // 将TextView改为可聚焦状态,以便展开/收起时接收触摸事件 isFocusable = true isFocusableInTouchMode = true } /** * 获取TextView展开状态下的完整文本 */ private fun getFullText(): CharSequence { val text = text movementMethod = LinkMovementMethod.getInstance() return text } /** * 获取TextView收起状态下的文本 */ private fun getCollapsedText(): CharSequence { val text = text val layout = layout ?: return text movementMethod = LinkMovementMethod.getInstance() val end = layout.getLineEnd(collapsedMaxLines - 1) val ellipsis = "..." val textTrimmed = text.subSequence(0, end) val lastSpace = textTrimmed.lastIndexOf(' ') val trimmedLength = textTrimmed.length return if (lastSpace == -1 || trimmedLength <= end - ellipsis.length) { "$textTrimmed$ellipsis" } else { val index = if (lastSpace + ellipsis.length > end) lastSpace else end - ellipsis.length "${textTrimmed.subSequence(0, index)}$ellipsis" } } /** * 保存TextView的状态 */ override fun onSaveInstanceState(): Parcelable? { val superState = super.onSaveInstanceState() return SavedState(superState).apply { isExpanded = this@ExpandableTextView.isExpanded } } /** * 恢复TextView的状态 */ override fun onRestoreInstanceState(state: Parcelable?) { var savedState = state if (savedState is SavedState) { isExpanded = savedState.isExpanded super.onRestoreInstanceState(savedState.superState) setText(if (isExpanded) getFullText() else getCollapsedText()) } else { super.onRestoreInstanceState(savedState) } } private class SavedState : BaseSavedState { var isExpanded: Boolean = false constructor(superState: Parcelable?) : super(superState) constructor(source: Parcel) : super(source) { isExpanded = source.readInt() == 1 } override fun writeToParcel(out: Parcel, flags: Int) { super.writeToParcel(out, flags) out.writeInt(if (isExpanded) 1 else 0) } companion object { @JvmField val CREATOR = object : Parcelable.Creator<SavedState> { override fun createFromParcel(source: Parcel): SavedState { return SavedState(source) } override fun newArray(size: Int): Array<SavedState?> { return arrayOfNulls(size) } } } } } ``` 使用方法: 在布局文件中使用该自定义TextView: ```xml <com.example.ExpandableTextView android:id="@+id/tv_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/lorem_ipsum" /> ``` 在代码中设置TextView的最大行数和展开/收起状态: ```kotlin val tvContent = findViewById<ExpandableTextView>(R.id.tv_content) tvContent.setCollapsedMaxLines(2) // 设置收起状态下的最大行数 tvContent.text = resources.getString(R.string.lorem_ipsum) // 设置TextView的文本 ``` 如果需要在RecyclerView中使用该自定义TextView,可以在Adapter中设置TextView的展开/收起状态: ```kotlin override fun onBindViewHolder(holder: ViewHolder, position: Int) { val item = itemList[position] holder.itemView.apply { tvContent.setCollapsedMaxLines(2) // 设置收起状态下的最大行数 tvContent.text = item.text // 设置TextView的文本 tvContent.isExpanded = item.isExpanded // 设置TextView的展开/收起状态 } } ```

相关推荐

最新推荐

2022最新Android中高级面试题合集.pdf

1.最新整理Android面试题 2.涵盖Java基础,jvm,Android常见面试问答,Kotlin面试题

Android中使用Kotlin实现一个简单的登录界面

Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,被称之为 Android 世界的Swift,由 JetBrains 设计开发并开源。接下来本文通过实例代码给大家讲解Android中使用Kotlin实现一个简单的登录界面,一起看看吧

Android 实现左滑出现删除选项

滑动删除的部分主要包含两个部分, 一个是内容区域(用于放置正常显示的view),另一个是操作区域(用于放置删除按钮)。下面通过本文给大家介绍Android 实现左滑出现删除选项,需要的朋友可以参考下

Android 使用Kotlin自定义View的方法教程

最近想加强一下自定义view方面的学习,正好也在学习Kotlin,所以就尝试着用Kotlin写一下简单的自定义view,下面这篇文章主要给大家介绍了关于Android使用Kotlin自定义View的方法教程,需要的朋友可以参考下。

Android两种轮询的实现方法

主要为大家详细介绍了Android两种轮询的实现方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

步行高级机器人技术.doc

步行高级机器人技术.doc

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire

粒子群多目标算法matlab代码【MATLAB代码实现】定义优化问题参数

# 1. 粒子群多目标算法简介 ## 1.1 什么是粒子群算法? 粒子群算法是一种基于群体智能的优化算法,灵感来源于鸟群或鱼群等生物群体的行为。每个“粒子”代表问题空间中的一个候选解,而整个粒子群代表了候选解的一个群体。粒子在解空间中搜索最优解,通过个体的经验和群体的协作来不断调整自身位置和速度,从而逐步靠近最优解。 ## 1.2 粒子群算法在多目标优化中的应用 粒子群算法最初是针对单目标优化问题提出的,但后来被扩展应用到了多目标优化领域。与单目标优化不同,多目标优化需要考虑多个冲突的目标函数,因此粒子群算法的应用在多目标优化中具有一定的挑战性。 ## 1.3 粒子群多目标算法原理解

c语言本题要求编写程序,计算学生们的平均成绩,并统计不及格人数。题目保证输入输出均在整型范围内。

好的,下面是一个简单的 C 语言程序,可以帮助你计算学生们的平均成绩,并统计不及格人数: ```c #include <stdio.h> int main() { int n, sum = 0, fail = 0; scanf("%d", &n); // 输入学生数量 for (int i = 0; i < n; i++) { int score; scanf("%d", &score); // 输入学生的成绩 sum += score; // 累加学生的成绩 if (score < 60) {

资料计算机二级Python真题及答案解析1练习.pdf

。。。