在一些应用中,比如腾讯的应用市场APP应用宝,关于某款应用的介绍文字,如果介绍文字过长,那么不是全部展现出来,而是显示三四行的开始部分(摘要),预知全部的内容,用户点击展开按钮即可查阅全部内容。
这样的设计有一定的优越性,毕竟用户的时间有限,注意力和关注力也有限,在使用APP时候,用户需要在最短时间内尽可能快速浏览和查阅到更主要内容,而不是一大堆泛泛而谈的文字内容。
在Android原生的TextView的基础上,可收缩/扩展的TextView:PhilExpandableTextView。
实现原理:核心是控制TextView的max lines。在TextView的初始化阶段但尚未绘制出View的时候,使用ViewTreeObserver,监听onPreDraw事件,获取TextView正常显示需要显示的总行数,但只给TextView设置最大运行的行数(小于总行数),从而造成TextView的收缩摘要效果,当用户通过按钮或其他方式扩展时候,把TextView的最大行数设置为正常显示完全的行数+1(+1是保持余量,避免不足)。

  1. package com.lixu.ExpandableTextView;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.view.View.OnClickListener;
  7. import android.widget.Button;
  8.  
  9. public class MainActivity extends Activity {
  10. private String str = "";
  11.  
  12. @Override
  13. protected void onCreate(Bundle savedInstanceState) {
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.activity_main);
  16.  
  17. for (int i = 0; i < 200; i++) {
  18. str = str + i + " ";
  19. }
  20. final ExpandableTextView etv = (ExpandableTextView) findViewById(R.id.etv);
  21. etv.setText(str);
  22.  
  23. Button btn = (Button) findViewById(R.id.btn);
  24.  
  25. btn.setOnClickListener(new OnClickListener() {
  26.  
  27. @Override
  28. public void onClick(View v) {
  29. boolean b = etv.getExpandablestatus();
  30.  
  31. b = !b;
  32. etv.setExpandable(b);
  33.  
  34. }
  35. });
  36.  
  37. }
  38.  
  39. }

PhilExpandableTextView.java:

  1. package com.lixu.ExpandableTextView;
  2.  
  3. import android.content.Context;
  4. import android.util.AttributeSet;
  5. import android.view.ViewTreeObserver;
  6. import android.view.ViewTreeObserver.OnPreDrawListener;
  7. import android.widget.TextView;
  8. import android.widget.Toast;
  9.  
  10. public class ExpandableTextView extends TextView {
  11.  
  12. // 最大行,默认显示3行
  13. private final int MAX = 3;
  14. // 完全展开需要的行数
  15. private int lines;
  16.  
  17. private ExpandableTextView mExpandableTextView;
  18.  
  19. private boolean expandablestatus = false;
  20.  
  21. // 构造方法用两个参数的
  22. public ExpandableTextView(Context context, AttributeSet attrs) {
  23. super(context, attrs);
  24. mExpandableTextView = this;
  25. init();
  26.  
  27. }
  28.  
  29. private void init() {
  30. // 在view绘制之前的时候执行,在onDraw之前
  31. ViewTreeObserver mViewTreeObserver = this.getViewTreeObserver();
  32. mViewTreeObserver.addOnPreDrawListener(new OnPreDrawListener() {
  33.  
  34. @Override
  35. public boolean onPreDraw() {
  36. // 避免重复监听
  37. mExpandableTextView.getViewTreeObserver().removeOnPreDrawListener(this);
  38. // 获得内容行数
  39. lines = getLineCount();
  40.  
  41. return true;
  42. }
  43. });
  44. setExpandable(false);
  45.  
  46. }
  47. // 是否展开或者收缩,
  48. // true,展开;
  49. // false,不展开
  50.  
  51. public void setExpandable(boolean isExpand) {
  52. if (isExpand) {
  53. setMaxLines(lines + 1);
  54. } else
  55. setMaxLines(MAX);
  56.  
  57. expandablestatus = isExpand;
  58. }
  59.  
  60. public boolean getExpandablestatus() {
  61. return expandablestatus;
  62. }
  63.  
  64. }

xml文件:

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5.  
  6. <com.lixu.ExpandableTextView.ExpandableTextView
  7. android:id="@+id/etv"
  8. android:layout_width="match_parent"
  9. android:layout_height="wrap_content"
  10. android:layout_alignParentTop="true" />
  11.  
  12. <Button
  13. android:id="@+id/btn"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:layout_alignParentBottom="true"
  17. android:layout_centerHorizontal="true"
  18. android:text="点击" />
  19.  
  20. </RelativeLayout>

运行效果图:

可伸缩的textview。的更多相关文章

  1. Android可伸缩布局-FlexboxLayout(支持RecyclerView集成)

    Android可伸缩布局-FlexboxLayout(支持RecyclerView集成) 1 . 前言 前几天看到Google官方的博客介绍了Google开源的一个强大的布局-FlexboxLayou ...

  2. 关于textview显示特殊符号居中的问题

    话说这是2017年的第一篇博客,也是一篇技术博客.先从简单的一篇解决问题开始吧,千里之行,始于足下! ------------------------------------------------- ...

  3. 奇葩问题-TextView无法获取值

    问题场景 前几天写一个界面的时候,遇到一个非常奇葩的问题.app第一次安装的时候,这里针对用户第一次安装的时候,后来是不会出现这个问题了.我明明是对某个界面的一个textview赋值了,而且服务端也返 ...

  4. 动态给textView加图片

    Drawable img = layout.getResources().getDrawable(R.drawable.icon); // 调用setCompoundDrawables时,必须调用Dr ...

  5. TextView使用大全

    最近打算写一个系列的android初级开发教程,预计40篇以上的文章,结合我实际工作中的经验,写一些工作中经常用到的技术,让初学者可以少走弯路,写一个系列的话,大家学习起来也有头有尾. 今天就从我们每 ...

  6. TextField和TextView的限制输入长度

    TextField的限制代理方法 只需要在这个代理方法里面code这样的代码就可以了 16 是长度可以自己设置 - (BOOL)textField:(UITextField *)textField s ...

  7. RAC textView的双向绑定

    今天在写关于textView的数据绑定时原先写法是这样的: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #78 ...

  8. android textview 自动换行 整齐排版

    一.问题在哪里? textview显示长文字时会进行自动折行,如果遇到一些特殊情况,自动折行会杯具成这个样子: 上述特殊情况包括: 1)全角/半角符号混排(一般是数字.字母.汉字混排) 2)全角/半角 ...

  9. textView的提醒文字

    如果我们想提交一些备注信息,会想到用textFiled和textView两种控件去实现 1.提醒文字是textFiled的特有属性,但是textFiled显示文本只有一行,不能实现我们输入较多文字的情 ...

随机推荐

  1. iOS - OC NSPoint 位置

    前言 结构体,这个结构体用来表示事物的一个坐标点. typedef CGPoint NSPoint; struct CGPoint { CGFloat x; CGFloat y; }; typedef ...

  2. 2016中国APP分类排行榜参选入围产品公示

    2016中国APP分类排行榜参选入围产品公示   由中国科学院<互联网周刊>.中国社会科学院信息化研究中心.eNet硅谷动力共同主办的2016中国APP分类排行榜发布暨颁奖晚宴即将举行.此 ...

  3. 超实用压力测试工具-ab工具

    在学习ab工具之前,我们需了解几个关于压力测试的概念 吞吐率(Requests per second)概念:服务器并发处理能力的量化描述,单位是reqs/s,指的是某个并发用户数下单位时间内处理的请求 ...

  4. [转载] Go语言并发之美

    原文: http://qing.blog.sina.com.cn/2294942122/88ca09aa33002ele.html 简介           多核处理器越来越普及,那有没有一种简单的办 ...

  5. hostapd源代码分析(二):hostapd的工作机制

    [转]hostapd源代码分析(二):hostapd的工作机制 原文链接:http://blog.csdn.net/qq_21949217/article/details/46004433 在我的上一 ...

  6. 每一个程序员需要了解的10个Linux命令

    作为一个程序员,在软件开发职业生涯中或多或少会用到Linux系统,并且可能会使用Linux命令来检索需要的信息.本文将为各位开发者分享10个有用的Linux命令,希望对你会有所帮助. 以下就是今天我们 ...

  7. 配置Java EE Eclipse+Tomcat开发环境

    以下将详细介绍在Eclipse下搭建Java EE开发环境的每一步, 环境:Win 7 + JDK 1.7 + Eclipse IDE for Java EE Developers 3.7 +Tomc ...

  8. MyEclipse/Eclipse中XML文件的格式化配置

    Eclipse中XML文件的格式化配置 MyEclipse: 这一步的配置是使格式化的效果为控件的每个属性配置占一行.进入 Window/Preferences,展开到 XML/XML Resourc ...

  9. 图解javascript中this指向

    JavaScript 是一种脚本语言,支持函数式编程.闭包.基于原型的继承等高级功能.JavaScript一开始看起来感觉会很容易入门,但是随着使用的深入,你会发JavaScript其实很难掌握,有些 ...

  10. Unity 3D中的内存管理

    本文欢迎转载,但烦请保留此行出处信息:http://www.onevcat.com/2012/11/memory-in-unity3d/ Unity3D在内存占用上一直被人诟病,特别是对于面向移动设备 ...