欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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;
 }
 
}

Android实现可收缩和扩展的TextView

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。