码迷,mamicode.com
首页 > 其他好文 > 详细

可伸缩的textview

时间:2017-03-26 01:26:31      阅读:229      评论:0      收藏:0      [点我收藏+]

标签: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;
    }

}

技术分享

 

可伸缩的textview

标签:string   save   find   控制   else   server   undle   nec   count()   

原文地址:http://www.cnblogs.com/ganchuanpu/p/6618995.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!