最近,写Android代码遇到的需求,需要文本可折叠,通过参考借鉴网上的资料和思路,自己写了一个。写篇博客记录下来,免得以后要用的时候,又要百度。
需求:在折叠状态下,文本如果大于最大显示行数,则在文本框能显示的最后一行加上“... 展开”,并与可显示的文本一起铺满整个文本框;在展开状态下,文本尾加上“ 折叠”。“展开”和“折叠”字体均为红色,且均可点击,点击后文本框变化到对应状态。
上代码(用ClickableSpan实现):
public class ExpandTextView extends AppCompatTextView {
private String originText = ""; //原始内容文本
private int initWidth = 0; //TextView可展示宽度
private int mMaxLines = 2; //TextView最大显示行数
private SpannableString SPAN_CLOSE = null; //收起的文本(颜色处理和点击监听)
private SpannableString SPAN_EXPAND = null; //展开的文本(颜色处理和点击监听)
private String TEXT_EXPAND = " 展开";
private String TEXT_CLOSE = " 收起";
private int SPAN_COLOR = R.color.red;
private boolean isClose = true;
private boolean isWidthModify = true; //用于控件宽高改变时通知重绘的判断,避免循环绘制
public ExpandTextView(Context context) {
super(context);
}
public ExpandTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ExpandTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
initWidth = getMeasuredWidth();
if(isWidthModify) {
notifyRefreshView();
isWidthModify = false;
}
}
/**
* 初始化"展开"的Span文本ÿ