当前位置: 移动技术网 > 移动技术>移动开发>Android > Android实现可收缩和扩展的TextView

Android实现可收缩和扩展的TextView

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

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

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网