可伸缩的textview详解(推荐)

作者:jingxian 时间:2021-11-06 00:34:51 

在Android原生的TextView的基础上,可收缩/扩展的TextView:PhilExpandableTextView。

实现原理:核心是控制TextView的max lines。在TextView的初始化阶段但尚未绘制出View的时候,使用ViewTreeObserver,监听onPreDraw事件,获取TextView正常显示需要显示的总行数,但只给TextView设置最大运行的行数(小于总行数),从而造成TextView的收缩摘要效果,当用户通过按钮或其他方式扩展时候,把TextView的最大行数设置为正常显示完全的行数+1(+1是保持余量,避免不足)。


public class MainActivity extends Activity {
 private String str = "";

@Override
 protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);

for (int i = 0; i < 200; i++) {
     str = str + i + " ";
   }
   final ExpandableTextView etv = (ExpandableTextView) findViewById(R.id.etv);
   etv.setText(str);

Button btn = (Button) findViewById(R.id.btn);

btn.setOnClickListener(new OnClickListener() {

@Override
     public void onClick(View v) {
       boolean b = etv.getExpandablestatus();

b = !b;
       etv.setExpandable(b);

}
   });

}

}

PhilExpandableTextView.java:


package com.ganchuanpu.ExpandableTextView;

import android.content.Context;
import android.util.AttributeSet;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnPreDrawListener;
import android.widget.TextView;
import android.widget.Toast;

public class ExpandableTextView extends TextView {

// 最大行,默认显示3行
 private final int MAX = 3;
 // 完全展开需要的行数
 private int lines;

private ExpandableTextView mExpandableTextView;

private boolean expandablestatus = false;

// 构造方法用两个参数的
 public ExpandableTextView(Context context, AttributeSet attrs) {
   super(context, attrs);
   mExpandableTextView = this;
   init();

}

private void init() {
   // 在view绘制之前的时候执行,在onDraw之前
   ViewTreeObserver mViewTreeObserver = this.getViewTreeObserver();
   mViewTreeObserver.addOnPreDrawListener(new OnPreDrawListener() {

@Override
     public boolean onPreDraw() {
       // 避免重复监听
       mExpandableTextView.getViewTreeObserver().removeOnPreDrawListener(this);
       // 获得内容行数
       lines = getLineCount();

return true;
     }
   });
   setExpandable(false);

}
 // 是否展开或者收缩,
 // true,展开;
 // false,不展开

public void setExpandable(boolean isExpand) {
   if (isExpand) {
     setMaxLines(lines + 1);
   } else
     setMaxLines(MAX);

expandablestatus = isExpand;
 }

public boolean getExpandablestatus() {
   return expandablestatus;
 }

}

可伸缩的textview详解(推荐)

标签:textview,伸缩
0
投稿

猜你喜欢

  • C#设计模式之Mediator中介者模式解决程序员的七夕缘分问题示例

    2021-10-05 16:28:14
  • Java执行hadoop的基本操作实例代码

    2022-11-13 12:08:04
  • C#中new的几种用法详解

    2021-09-16 23:05:56
  • Springmvc调用存储过程,并返回存储过程返还的数据方式

    2022-07-24 20:10:44
  • Android 自定义来电秀实现总结

    2023-12-17 07:52:32
  • Java 实战项目之小说在线阅读系统的实现流程

    2022-01-31 07:41:49
  • Spring的事务机制实例代码

    2021-09-11 07:46:23
  • java8使用filter()取出自己所需数据

    2023-04-07 02:30:37
  • 一文讲通Java为什么不支持多继承原理

    2023-09-28 23:32:50
  • 基于WPF实现步骤控件的示例代码

    2021-09-12 15:16:16
  • 详解android webView独立进程通讯方式

    2022-03-04 13:51:18
  • java使用dom4j解析xml配置文件实现抽象工厂反射示例

    2022-11-10 15:45:38
  • 详解Mybatis中的select方法

    2023-06-10 05:44:49
  • Java单例模式实现的几种方式

    2021-06-09 18:38:47
  • springboot配置mysql数据库spring.datasource.url报错的解决

    2023-10-04 12:49:26
  • 一篇文章带你入门Java基本概念

    2023-11-26 01:17:08
  • java显示当前运行时的参数(java运行参数)

    2023-09-07 10:03:22
  • c#序列化详解示例

    2022-09-12 02:39:00
  • Spring中自动装配的4种方式

    2021-08-01 16:44:41
  • java LockSupport实现原理示例解析

    2023-05-14 06:43:05
  • asp之家 软件编程 m.aspxhome.com