美文网首页
TextView省略号之后添加可点击文本

TextView省略号之后添加可点击文本

作者: 懒猫1105 | 来源:发表于2018-09-06 10:29 被阅读0次

    1.TextView省略号之后添加可点击文本

    实现的效果图:

    实现思路:

    1. 使用TextUtils.ellipsize来获得带省略号的文本之后再加上可点击的文本
    2. TextUtils.ellipsize获取带省略号文本时候传入的avail参数,要计算上要添加的文本长度来保证添加的文本不会超出TextView
    3. 将获得带省略号的文本加上可点击文本
    4. 使用ClickableSpan为可点击文本添加点击事件
    5. TextView.setText()将最终文本设置到TextView上
    6. xml布局文件中,TextView记得加上android:maxLines属性
        /**
         * 给TextView的超长文本省略号之后加上点击文本
         *
         * @param tv           TextView
         * @param originalText 原始的超长文本
         * @param endStr       要添加在末尾的文本
         * @param endStrColor  末尾文本颜色
         * @param listener     点击事件
         */
        public static void setEllipsize(@NonNull final TextView tv, @Nullable final String originalText, @Nullable final String endStr, @ColorInt final int endStrColor, @Nullable final View.OnClickListener listener) {
            tv.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    TextPaint paint = tv.getPaint();
                    // TextView最大支持文本宽度 - 要添加在末尾的文本宽度
                    float avail = (tv.getWidth() - tv.getPaddingLeft() - tv.getPaddingRight()) * tv.getMaxLines() - paint.getTextSize() * (endStr == null ? 0 : endStr.length() + 1);
                    // 获取带省略号的文本
                    String string = TextUtils.ellipsize(TextUtils.isEmpty(originalText) ? tv.getText() : originalText, paint, avail, TextUtils.TruncateAt.END).toString();
                    // 带省略号的文本 + 添加在末尾的文本
                    string = string + endStr;
                    SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(string);
                    // 点击事件和添加在末尾的文本效果
                    spannableStringBuilder.setSpan(new ClickableSpan() {
                        @Override
                        public void onClick(View view) {
                            if (listener != null) listener.onClick(view);
                        }
    
                        @Override
                        public void updateDrawState(@NonNull TextPaint ds) {
                            super.updateDrawState(ds);
                            // 添加在末尾的文本颜色
                            ds.setColor(endStrColor);
                            // 添加在末尾的文本去掉下划线
                            ds.setUnderlineText(false);
                            // 清除阴影
                            ds.clearShadowLayer();
                        }
                    }, string.length() - endStr.length(), string.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                    
                    // 重新设置TextView文本
                    tv.setText(spannableStringBuilder);
                    // 去除默认点击后背景变色效果
                    tv.setHighlightColor(Color.TRANSPARENT);
                    // 让点击事件可以生效
                    tv.setMovementMethod(LinkMovementMethod.getInstance());
                    // 取消关注,让点击事件与ListView的Item点击事件不再冲突
                    tv.setFocusable(false);
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                        tv.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                    } else {
                        tv.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                    }
                }
            });
        }
    

    相关文章

      网友评论

          本文标题:TextView省略号之后添加可点击文本

          本文链接:https://www.haomeiwen.com/subject/nfitgftx.html