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

可伸缩的textview详解(推荐)

程序员文章站 2023-11-11 09:27:40
在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; 
  } 
 
}

可伸缩的textview详解(推荐)

以上这篇可伸缩的textview详解(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。