标签:string save find 控制 else server undle nec count()
在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;
    }
}

标签:string save find 控制 else server undle nec count()
原文地址:http://www.cnblogs.com/ganchuanpu/p/6618995.html