很多时候我们的文字过长时,都会选择先展示几行,点击展开按钮的时候再展示全部内容,如图所示:

今天我们就是要实现这样一个功能的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相关推荐

  1. Flutter折叠展开列表的使用

      flutter中官方其实已经封装好了折叠展开列表:ExpansionPanel,但是官方的可定制性太差,我今天主要说下如何简单实现一个自己的折叠展开列表. 状态控制   折叠展开列表,每一个父列表 ...

  2. 可展开/折叠的Android TextView:ExpandableTextView

    可展开/折叠的Android TextView:ExpandableTextView

  3. android textView 折叠 展开 ExpandableTextView

    项目过程中可能会用到可以折叠和展开的TextView , 这里给出一种实现思路,自定义控件. package com.example.expandtextviewdemo;import android ...

  4. Android多行文本折叠展开效果

    转自:http://blog.csdn.net/qiaoidea/article/details/45568653 [导航]  - 单行文本水平触摸滑动效果 通过EditText实现TextView单 ...

  5. 三层嵌套gridview 的折叠展开

    三层嵌套gridview 的折叠展开 在asp.net 2.0中,gridview也同样可以很多花样,比如做一个三层嵌套GRIDVIEW的展开.就是说,一般是主从关系的,现在是三层关系了, 可以点A, ...

  6. java列表展开折叠,jQuery Datatables rowGroup折叠/展开

    首先添加状态以跟踪折叠组: var collapsedGroups = {}; 接下来,将其添加到Datatable初始化以启用rowGroup插件 . 它通过检查 collapapsedGroups ...

  7. Android展开的TextView和点击底部滚动到顶部

    小功能,希望后来者拿去就能用 一:展开的TextView,继承linerlayout,直接上代码了 public class ExpandTextView extends LinearLayout { ...

  8. element-ui之el-collapse-transition(折叠展开动画)源码解析学习

    2019独角兽企业重金招聘Python工程师标准>>> 项目中发现同事使用了element-ui的el-collapse-transition来做折叠展开效果,打开源码看了下发现挺有 ...

  9. 有关列表折叠展开的问题

    在有列表展开的页面,实现列表展开折叠效果,最常用的就是获取列表的索引值(列表从后台获取数据,利用循环渲染到前端),通过点击事件获取当前的索引值与循环产生的索引值比对,看是否匹配,匹配则展开,否则不展开 ...

最新文章

  1. python3.82版本安装_CentOS7下安装Python3和Python2并存
  2. 如何扩大临linux零时空间,手把手教你如何扩充linux系统空间
  3. YunYang1994/tensorflow-yolov3 训练自己的数据集
  4. Tomcat学习笔记01【Web相关概念、Tomcat基本操作】
  5. golang常用库:字段参数验证库-validator使用
  6. jeeCMS首页加载流程
  7. 整数去重(信息学奥赛一本通-T1117)
  8. 在WebStorm环境中给nodejs项目中添加packages
  9. Xshell连接linux(deepin)时提示ssh服务器拒绝了密码,请再试一次解决方法
  10. python办公自动化案例-用python进行办公自动化都需要学习什么知识呢?
  11. localhost:8080
  12. 第八届北京国际电影节开幕 首次发布中国电影大数据
  13. 看房一次就租下的90后,大概都喜欢Q房网
  14. 太极图php代码,css画太极图(阴阳八卦)
  15. 使用XMAPP启动MySQL出现Error: MySQL shutdown unexpectedly 的解决办法
  16. 能做好上传下达吗(命令模式)
  17. nodejs 之npm包
  18. iPhone弱网测试
  19. 虚拟数字人遇上ChatGPT,好看的皮囊和有趣的灵魂?
  20. ubuntu 运行QQ轻聊版7.9

热门文章

  1. 【渝粤题库】国家开放大学2021春2226物业管理实务(2)题目
  2. labview编程笔记之条件结构
  3. 大学物理·第15章【量子物理】
  4. python \x0d\x0a \x0a
  5. 查找算法——俄罗斯轮盘赌算法(看谁运气不好)
  6. BZOJ - 3884 上帝与集合的正确用法
  7. Nginx总结(安装,使用,正向代理,反向代理,负载均衡)
  8. Groovy使用字符串
  9. 非稳态计算时间步和最大迭代数的设定(分享)
  10. 计算机专业国外访学进修目的,浙江师范大学关于2012年度专业技术职务评审工作的实施意见...