可伸缩的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,伸缩
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