Android实现可收缩和扩展的TextView
程序员文章站
2023-11-19 21:38:10
在android原生的textview的基础上,可收缩/扩展的textview:philexpandabletextview。
实现原理:核心是控制textview的...
在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; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 百度推出飓风算法,专业治理恶劣采集!
下一篇: 网络赚钱最快的方法(日入一百)