Android textview 文字显示不下用省略号代替 并且接图标 ,图标可点击

序言:在日常开发中,业务提出了一个需求需要文本显示不下最多显示两行 并且在第二行末尾用省略号表示显示不下,还要接上一个图标 图标可以点击弹窗显示所有文字内容效果如下:

image.png

问题: 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));
        }
    });
}
复制代码

猜你喜欢

转载自juejin.im/post/7089293449635037192