首页 > 代码库 > 如何写一个可以展开的TextView

如何写一个可以展开的TextView

原理是通过点击的时候设置 setMaxLines(lineNum)来实现:

public class ExpandableTextView extends TextView {
    private static int MIN_LINE_NUM = 2;
    private static int MAX_LINE_NUM = 20;
    private int lineNum = MIN_LINE_NUM;
    private boolean mIsExpanded = false;
    Bitmap bitmapDown;
    Bitmap bitmapUp;
    int w, h;
    /** 点击事件listener */
    private OnClickListener mOnClickListener;

    public ExpandableTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs);
    }

    private void init(Context context, AttributeSet attrs) {
        setMaxLines(lineNum);
        bitmapDown = BitmapFactory.decodeResource(getResources(), R.drawable.update_detail_down);
        bitmapUp = BitmapFactory.decodeResource(getResources(), R.drawable.update_detail_up);
        w = bitmapDown.getWidth() + (int) context.getResources().getDimension(R.dimen.expand_textview_right);
        h = bitmapDown.getHeight() + (int) context.getResources().getDimension(R.dimen.expand_textview_bottom);
        
        super.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (lineNum == MIN_LINE_NUM) {
                    lineNum = MAX_LINE_NUM;
                    setMaxLines(lineNum);
                } else {
                    lineNum = MIN_LINE_NUM;
                    setMaxLines(lineNum);
                }
                if (mOnClickListener != null) {
                    mOnClickListener.onClick(v);
                }
            }
        });
    }

    @Override
    public void setOnClickListener(OnClickListener listener) {
        if (!isClickable()) {
            setClickable(true);
        }
        mOnClickListener = listener;
    }

    @Override
    public void setMaxLines(int maxlines) {
        super.setMaxLines(maxlines);

        if (lineNum == MAX_LINE_NUM) {
            mIsExpanded = true;
        } else {
            mIsExpanded = false;
        }
    }

    public boolean isExpanded() {
        return mIsExpanded;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        if (getLineCount() <= MIN_LINE_NUM) {
            super.onDraw(canvas);
            return;
        }
        if (lineNum == MIN_LINE_NUM) {
            canvas.drawBitmap(bitmapDown, getWidth() - w, getHeight() - h, null);
        } else {
            canvas.drawBitmap(bitmapUp, getWidth() - w, getHeight() - h, null);
        }
        super.onDraw(canvas);
    }


    public void setMaxLine(int line) {
        lineNum = line;
        setMaxLines(line);
    }
}

这样来写Layout:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFF" >

    <TextView
        android:id="@+id/detail_action"
        android:textColor="#000000"
        android:textSize="11sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginRight="8dip"
        android:drawablePadding="4dip"
        android:paddingBottom="10dip"
        android:paddingTop="10dip"
        android:singleLine="true"
        android:text="sdfkljsfiosjdfiosfjsiofjsdifsd" />

    <com.example.view.ExpandableTextView
        android:id="@+id/textview"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:layout_below="@id/detail_action"
        android:lineSpacingExtra="4dip"
        android:paddingBottom="-40dip"
        android:paddingRight="48dip"
        android:text="adfsfsfewrwerwerwerqRWgdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfERSAFSDFSDFSDd"
        android:layout_marginTop="-5dip"
        android:textColor="#000000" >
    </com.example.view.ExpandableTextView>
    
    
     <TextView
        android:id="@+id/detail_action1"
        android:textColor="#000000"
        android:textSize="11sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/textview"
        android:layout_marginRight="8dip"
        android:drawablePadding="4dip"
        android:paddingBottom="10dip"
        android:paddingTop="10dip"
        android:singleLine="true"
        android:text="sdfkljsfiosjdfiosfjsiofjsdifsd" />

</RelativeLayout>


如何写一个可以展开的TextView