Android开发:实现文本(TextView)的折叠、展开/收起

1,440 阅读1分钟

描述: 一个很常见的需求,多用于商品详情页的描述吧。

照惯例,先上效果图

实现文本(TextView)的折叠

实现方式也很简单,主要是用了SpannableString。对文字样式进行修改 上代码:

  
    public void onMessage(String message) {
        this.message = message;
        if (message == null || message.isEmpty())
            this.message = "默认字符串";
        if (this.message.length() > 50) {
            setMessage(2);
        } else {
            setMessage(1);
        }
    }

    public void setMessage(int label) {
        if (message != null && !message.isEmpty()) {
            String str;//显示的字符串
            str = "简介:" + message;
            SpannableString spannableString = null;
            if (str.length() <= 50)//字符串长度不够
                label = 1;
            switch (label) {
                case 2:
                    //展开
                    str = str.substring(0, 50);
                    str += "...展开";
                    spannableString = new SpannableString(str);
                    //可点击
                    ClickableSpan clickableSpan1 = new ClickableSpan() {
                        @Override
                        public void onClick(View widget) {
                            setMessage(3);
                        }

                        @Override
                        public void updateDrawState(@NonNull TextPaint ds) {
                            super.updateDrawState(ds);
                            ds.setColor(Color.parseColor("#00BFFF"));
                        }
                    };
                    spannableString.setSpan(clickableSpan1, str.length() - 2, str.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
                    break;
                case 3:
                    //收起
                    str += "收起";
                    spannableString = new SpannableString(str);
                    //可点击
                    ClickableSpan clickableSpan2 = new ClickableSpan() {
                        @Override
                        public void onClick(View widget) {
                            setMessage(2);
                        }

                        @Override
                        public void updateDrawState(@NonNull TextPaint ds) {
                            super.updateDrawState(ds);
                            ds.setColor(Color.parseColor("#00BFFF"));
                        }
                    };
                    spannableString.setSpan(clickableSpan2, str.length() - 2, str.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
                    //收起
                    break;
                default:
                    //直接展示
                    spannableString = new SpannableString(str);
                    break;
            }
            StyleSpan styleSpan = new StyleSpan(Typeface.BOLD);
            spannableString.setSpan(styleSpan, 0, 3, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
            mActivityMainBinding.tvStr.setText(spannableString);
            mActivityMainBinding.tvStr.setMovementMethod(LinkMovementMethod.getInstance());
        }
    }

代码是根据自己需求写的。也有优化的空间,这里就不赘述了