当前位置: 移动技术网 > IT编程>移动开发>Android > 可伸缩的textview详解(推荐)

可伸缩的textview详解(推荐)

2019年07月24日  | 移动技术网IT编程  | 我要评论

858期货网,鱼珠木材市场,汉字宫

在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详解(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网