自己实现一个可以折叠展开的TextView
很多时候我们的文字过长时,都会选择先展示几行,点击展开按钮的时候再展示全部内容,如图所示:
今天我们就是要实现这样一个功能的textview。
实现的功能
我们实现的可以折叠展开的TextView具有以下功能:
1.如果文字不超过三行,则显示文字真实的行数,并且不显示折叠展开的按钮;如果文字超过三行,则默认只显示3行文字(这个可以自己设置),显示折叠展开的按钮。
2.当按钮显示的时候,如果文字是展开状态,则使文字变为折叠状态,反之,如果文字是折叠状态,点击按钮变为展开状态。
思路
1.首先,我们需要用一个LinearLayout包裹一个TextView和ImageView。TextView用来显示文字,ImageView用来显示折叠展开的按钮。
2.接下来,我们要使TextView初始只显示3行文字(当然显示几行你可以自己定义)。这里我们在onMeasure之后,
可以通过mTextView.getLineCount()
得到TextView真正的行数
通过mTextView.getLineHeight()
得到TextView一行的高度
然后,当mTextView.getLineCount()
>=3的时候,
通过mTextView.setHeight(mTextView.getLineHeight() * foldLines)
设置TextView的高度,这里的foldLines就是我们折叠时候的行数,我设的是3。
并且设置按钮可见
3.为按钮设置点击事件
mOpenBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if(isOpen){//to closemTextView.setHeight(mTextView.getLineHeight() * foldLines);mOpenBtn.setImageResource(R.drawable.icon_up_arrow);isOpen = false;}else{//to openmTextView.setHeight(mTextView.getLineHeight() * mTextView.getLineCount());mOpenBtn.setImageResource(R.drawable.icon_down_arrow);isOpen = true;}}});
代码
ExpandableTextView:
package com.example.myapp.view;import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;import com.example.myapp.R;/*** Created by yanru.zhang on 16/7/26.* Email:yanru.zhang@renren-inc.com*/
public class ExpandableTextView extends LinearLayout {private TextView mTextView;private ImageView mOpenBtn;private boolean isOpen = false;private int foldLines = 3; //大于3行的时候折叠private int lineCounts;public ExpandableTextView(Context context) {this(context, null);}public ExpandableTextView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public ExpandableTextView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}private void initView() {lineCounts = mTextView.getLineCount();if(lineCounts <= foldLines){mOpenBtn.setVisibility(GONE);}if(isOpen && mTextView.getHeight() != lineCounts * mTextView.getLineHeight()){mTextView.setHeight(mTextView.getLineHeight() * mTextView.getLineCount());}else if(!isOpen && mTextView.getHeight() != foldLines * mTextView.getLineHeight()){mTextView.setHeight(mTextView.getLineHeight() * foldLines);}mOpenBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if(isOpen){//to closemTextView.setHeight(mTextView.getLineHeight() * foldLines);mOpenBtn.setImageResource(R.drawable.icon_up_arrow);isOpen = false;}else{//to openmTextView.setHeight(mTextView.getLineHeight() * mTextView.getLineCount());mOpenBtn.setImageResource(R.drawable.icon_down_arrow);isOpen = true;}}});}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);Log.d("zyr","onMeasure");initView();}@Overrideprotected void onFinishInflate() {super.onFinishInflate();Log.d("zyr","onFinishInflate");if(mTextView==null || mOpenBtn == null){mTextView = (TextView)getChildAt(0);mOpenBtn = (ImageView)getChildAt(1);}}
}
ExpandableTvActivity:
package com.example.myapp.activity;import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;import com.example.myapp.R;
import com.example.myapp.view.ExpandableTextView;/*** Created by yanru.zhang on 16/7/22.* Email:yanru.zhang@renren-inc.com*/
public class ExpandableTvActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_expandable_tv);}
}
activity_expandable_tv.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><com.example.myapp.view.ExpandableTextViewandroid:id="@+id/expandable_tv"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><TextView android:id="@+id/text_view"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="相思 \n王维\n红豆生南国,\n春来发几枝。\n愿君多采撷,\n此物最相思。"/><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="right"android:padding="10dp"android:src="@drawable/icon_up_arrow"/></com.example.myapp.view.ExpandableTextView><com.example.myapp.view.ExpandableTextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="O(∩_∩)O哈哈哈~"/><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="right"android:padding="10dp"android:src="@drawable/icon_up_arrow"/></com.example.myapp.view.ExpandableTextView>
</LinearLayout>
自己实现一个可以折叠展开的TextView相关推荐
- Flutter折叠展开列表的使用
flutter中官方其实已经封装好了折叠展开列表:ExpansionPanel,但是官方的可定制性太差,我今天主要说下如何简单实现一个自己的折叠展开列表. 状态控制 折叠展开列表,每一个父列表 ...
- 可展开/折叠的Android TextView:ExpandableTextView
可展开/折叠的Android TextView:ExpandableTextView
- android textView 折叠 展开 ExpandableTextView
项目过程中可能会用到可以折叠和展开的TextView , 这里给出一种实现思路,自定义控件. package com.example.expandtextviewdemo;import android ...
- Android多行文本折叠展开效果
转自:http://blog.csdn.net/qiaoidea/article/details/45568653 [导航] - 单行文本水平触摸滑动效果 通过EditText实现TextView单 ...
- 三层嵌套gridview 的折叠展开
三层嵌套gridview 的折叠展开 在asp.net 2.0中,gridview也同样可以很多花样,比如做一个三层嵌套GRIDVIEW的展开.就是说,一般是主从关系的,现在是三层关系了, 可以点A, ...
- java列表展开折叠,jQuery Datatables rowGroup折叠/展开
首先添加状态以跟踪折叠组: var collapsedGroups = {}; 接下来,将其添加到Datatable初始化以启用rowGroup插件 . 它通过检查 collapapsedGroups ...
- Android展开的TextView和点击底部滚动到顶部
小功能,希望后来者拿去就能用 一:展开的TextView,继承linerlayout,直接上代码了 public class ExpandTextView extends LinearLayout { ...
- element-ui之el-collapse-transition(折叠展开动画)源码解析学习
2019独角兽企业重金招聘Python工程师标准>>> 项目中发现同事使用了element-ui的el-collapse-transition来做折叠展开效果,打开源码看了下发现挺有 ...
- 有关列表折叠展开的问题
在有列表展开的页面,实现列表展开折叠效果,最常用的就是获取列表的索引值(列表从后台获取数据,利用循环渲染到前端),通过点击事件获取当前的索引值与循环产生的索引值比对,看是否匹配,匹配则展开,否则不展开 ...
最新文章
- python3.82版本安装_CentOS7下安装Python3和Python2并存
- 如何扩大临linux零时空间,手把手教你如何扩充linux系统空间
- YunYang1994/tensorflow-yolov3 训练自己的数据集
- Tomcat学习笔记01【Web相关概念、Tomcat基本操作】
- golang常用库:字段参数验证库-validator使用
- jeeCMS首页加载流程
- 整数去重(信息学奥赛一本通-T1117)
- 在WebStorm环境中给nodejs项目中添加packages
- Xshell连接linux(deepin)时提示ssh服务器拒绝了密码,请再试一次解决方法
- python办公自动化案例-用python进行办公自动化都需要学习什么知识呢?
- localhost:8080
- 第八届北京国际电影节开幕 首次发布中国电影大数据
- 看房一次就租下的90后,大概都喜欢Q房网
- 太极图php代码,css画太极图(阴阳八卦)
- 使用XMAPP启动MySQL出现Error: MySQL shutdown unexpectedly 的解决办法
- 能做好上传下达吗(命令模式)
- nodejs 之npm包
- iPhone弱网测试
- 虚拟数字人遇上ChatGPT,好看的皮囊和有趣的灵魂?
- ubuntu 运行QQ轻聊版7.9
热门文章
- 【渝粤题库】国家开放大学2021春2226物业管理实务(2)题目
- labview编程笔记之条件结构
- 大学物理·第15章【量子物理】
- python \x0d\x0a \x0a
- 查找算法——俄罗斯轮盘赌算法(看谁运气不好)
- BZOJ - 3884 上帝与集合的正确用法
- Nginx总结(安装,使用,正向代理,反向代理,负载均衡)
- Groovy使用字符串
- 非稳态计算时间步和最大迭代数的设定(分享)
- 计算机专业国外访学进修目的,浙江师范大学关于2012年度专业技术职务评审工作的实施意见...