序言:在日常开发中,业务提出了一个需求需要文本显示不下最多显示两行 并且在第二行末尾用省略号表示显示不下,还要接上一个图标 图标可以点击弹窗显示所有文字内容效果如下:
问题: 1、文本固定显示两行并且在末尾用省略号代替 2、末尾跟随可点击的图标
实现思路:
1、首先末尾省略号我采取的是获取每一行的字数,然后根据需要展示的行数 累计 最后替换字符串
2、文本末尾跟上图标我们可以用SpannableStringBuilder 实现
获取每一行字数
Layout layout = textView.getLayout();
//获取textview的行数
int lineCount = layout.getLineCount();
if (lineCount == 0) {
return;
}
if (StringUtils.isEmpty(text)) {
return;
}
String result = "";
//lineEnd表示某一行最后一个字的下标记
int lineEnd = 0;
if (lineCount == 1) {
lineEnd = layout.getLineEnd(0);
} else if (lineCount >= 2) {
lineEnd = layout.getLineEnd(1);
}
if (lineEnd > 2) {
result = text.substring(0, lineEnd - 2);
}
省略号
SpannableStringBuilder spannableString = new SpannableStringBuilder();
spannableString.clear();
spannableString.append(result).append("... ");
跟上图标
//也可以这样
Drawable drawable = BaseApplication.getContext().getResources().getDrawable(icon);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
ImageSpan imageSpan1 = new ImageSpan(drawable);
spannableString.setSpan(imageSpan1, spannableString.length() - 2, spannableString.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(clickableSpan, spannableString.length() - 2, spannableString.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);
图标可以点击需要用到clickableSpan 注意要想点击还必须设置
textView.setMovementMethod(LinkMovementMethod.getInstance());
//设置这个是为了在点击时没有按下效果
textView.setHighlightColor(BaseApplication.getContext().getResources().getColor(android.R.color.transparent));
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View view) {
//弹窗显示全部的文字内容 ,这儿根据需求不同可以不同处理
OldUtils.getInstance().showWarn(text, title, context);
}
@Override
public void updateDrawState(@androidx.annotation.NonNull TextPaint ds) {
super.updateDrawState(ds);
ds.setColor(BaseApplication.getContext().getResources().getColor(android.R.color.transparent));
}
};
最后附上完整代码
/**
* 用于textview 展示超出两行显示...并且在后面跟上图标
*@param textview 展示内容的textview
*@param icon 末尾图标
*@param text 展示的内容
*@param title 弹窗上需要展示的标题 没有可以不传
*@param context 上下文
*/
public void setTextLineWithIcon(final TextView textView, final int icon, final String text, final String title
, final Context context) {
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.post(new Runnable() {
@Override
public void run() {
Layout layout = textView.getLayout();
int lineCount = layout.getLineCount();
if (lineCount == 0) {
return;
}
if (StringUtils.isEmpty(text)) {
return;
}
String result = "";
int lineEnd = 0;
if (lineCount == 1) {
lineEnd = layout.getLineEnd(0);
} else if (lineCount >= 2) {
//当行数大于等于两行时取第二行末尾的下标 如果需要在第三行接图标可以用layout.getLineEnd(2); 这儿注意判断行数是否大于三行 不然这样取会崩溃
lineEnd = layout.getLineEnd(1);
}
if (lineEnd > 2) {
result = text.substring(0, lineEnd - 2);
}
SpannableStringBuilder spannableString = new SpannableStringBuilder();
spannableString.clear();
spannableString.append(result).append("... ");
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View view) {
//图标点击事件 根据需求不同 逻辑不同
OldUtils.getInstance().showWarn(text, title, context);
}
@Override
public void updateDrawState(@androidx.annotation.NonNull TextPaint ds) {
super.updateDrawState(ds);
ds.setColor(BaseApplication.getContext().getResources().getColor(android.R.color.transparent));
}
};
//也可以这样
Drawable drawable = BaseApplication.getContext().getResources().getDrawable(icon);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
ImageSpan imageSpan1 = new ImageSpan(drawable);
spannableString.setSpan(imageSpan1, spannableString.length() - 2, spannableString.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(clickableSpan, spannableString.length() - 2, spannableString.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);
textView.setHighlightColor(BaseApplication.getContext().getResources().getColor(android.R.color.transparent));
}
});
}
作者:爱看小说的赫
链接:https://juejin.cn/post/7089293449635037192
更多资讯请关注【公众号】
网友评论