首页 > 系统 > Android > 正文

Android实现可收缩和扩展的TextView

2019-12-12 03:16:09
字体:
来源:转载
供稿:网友

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

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表