目录
前言
最近在做一个效果,就是当文本显示超出2行时,文本末尾出现...(省略号),并且显示一个【展开】的按钮。点击时【展开】全部文本内容,并且按钮由【展开】变成【收起】。点击【收起】文本恢复到一开始状态。
一、TextView设置最大行与省略号
单行显示,如果超出的话用“…”省略号显示,只要设置:
android:ellipsize="end"
android:singleLine="true"
多行显示,超出的部分使用“…”显示,那么,设置如下:
android:lines="2"
android:ellipsize="end"
动态代码设置行数与省略号:
mTxt.setMaxLines(2);
mTxt.setEllipsize(TextUtils.TruncateAt.END);
TruncateAt:末尾、中间、开始
二、检查文本是否省略
TextView textView = (TextView) findViewById(R.id.txt);
Layout l=textView.getLayout();
if(l != null){
int lines =l.getLineCount();
if(lines>0){
if(l.getEllipsisCount(lines-1)>0){
LogUtils.d(TAG, "Text is ellipsized");
}
}
}else {
LogUtils.d(TAG,"Layout is null");
}
通过textview获取Layout,然后根据Layout的一个方法getEllipsisCount(int),来判断是否已经省略。
三、实战
由于Layout要等TextView绘制完了才能够拿到Layout的对象。直接获取Layout值都是null。
/**
* 设置txt超出2行
*/
int ellipsisCount = 0;
private void setEllipsisCount() {
final int LINES = 2;
//获取省略的字符数,0表示没和省略
mScope.postDelayed(() -> {
ellipsisCount = mScope.getLayout().getEllipsisCount(mScope.getLineCount() - 1);
//ellipsisCount>0说明没有显示全部,存在省略部分。
if (ellipsisCount > 0) {
mScopeClose.setVisibility(View.VISIBLE);
}
}, 200);
mScopeClose.setOnClickListener(v -> {
if (ellipsisCount > 0 && mScope.getLineCount() < 3) {
mScope.setMaxLines(Integer.MAX_VALUE);
mScopeClose.setText("【收起】");
} else {
mScopeClose.setText("【查看详情】");
mScope.setMaxLines(LINES);
}
});
}