android Textview 实现展开收缩功能+部分文字点击 (SpannableString)

//                ((TextView) helper.getView(R.id.tv_contents)).setText(getClickableSpan(content, true, (TextView) helper.getView(R.id.tv_contents)));
//                ((TextView)helper.getView(R.id.tv_contents)).setMovementMethod(LinkMovementMethod.getInstance());
/**
 * content 文字内容
 * isOpen 是展开|收缩
 * 
 *瞎瞎瞎写
 **/
private SpannableString getClickableSpan(final String content,boolean isOpen, final TextView textView) {
        if(content.length()<40){
            return new SpannableString(content);
        }else {
            View.OnClickListener openlistener = new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    textView.setText(getClickableSpan(content, true, textView));
                }
            };
            View.OnClickListener shrinklistener = new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    textView.setText(getClickableSpan(content, false, textView));
                }
            };
            String imageString = isOpen ? "[00OPEN00]" : "[00OPEN00]";
            String openString = isOpen ? "    展开" : "    收缩";
            String shrinkContent = content.substring(0, 35);
            Drawable drawable = getResources().getDrawable(R.mipmap.ic_spinner_resouces_arrow);
            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
            SpannableString spanableInfo = new SpannableString((isOpen ? shrinkContent : content )+ openString + imageString);
            int start = (isOpen ? shrinkContent : content).length();
            int end = spanableInfo.length();
            spanableInfo.setSpan(new Clickable(isOpen ? shrinklistener:openlistener), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            spanableInfo.setSpan(new ForegroundColorSpan(Color.GRAY), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            spanableInfo.setSpan(new NoUnderlineSpan(), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            spanableInfo.setSpan(new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE), start + openString.length(), end, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
            return spanableInfo;
        }
    }
    //修改点击事件回调
    class Clickable extends ClickableSpan implements View.OnClickListener {
        private final View.OnClickListener mListener;
        public Clickable(View.OnClickListener l){
            mListener = l;
        }
        @Override
        public void onClick(View v){
            mListener.onClick(v);
        }
    }
    //去下划线
    public class NoUnderlineSpan extends UnderlineSpan {
        @Override
        public void updateDrawState(TextPaint ds) {
            super.updateDrawState(ds);
            ds.setUnderlineText(false);
        }
    }
    
    
    
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值