android7.0 TextView去除超链接下划线就这么难吗?

只想实现像微信那样识别url,去除下划线,网上满篇的都是setUnderlineText(false),其实毫无作用,以下是网上普遍的解决办法,但是下划线依然没有去掉,请问各位有可行解决办法吗

已经解决了,添加一句就好了

@Override
    public void initComponents() {
        TextView textView = ((TextView) findViewById(R.id.summary));
        textView.setText(R.string.about_text);
        stripUnderlines(textView);
    }

    private class URLSpanNoUnderline extends URLSpan {
        public URLSpanNoUnderline(String url) {
            super(url);
        }
        @Override public void updateDrawState(TextPaint ds) {
            super.updateDrawState(ds);
            ds.setUnderlineText(false);
        }
    }

    private void stripUnderlines(TextView textView) {
        if(null!=textView&&textView.getText() instanceof Spannable){
            Spannable s = (Spannable)textView.getText();
            URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class);
            for (URLSpan span: spans) {
                int start = s.getSpanStart(span);
                int end = s.getSpanEnd(span);
                s.removeSpan(span);
                span = new URLSpanNoUnderline(span.getURL());
                s.setSpan(span, start, end, 0);
            }
            
            setAutoLinkMask(0);//已经解决,添加这一句就好了
            textView.setText(s);
        }
    }
阅读 8k
2 个回答

setAutoLinkMask(0);//已经解决,添加这一句就好了

请问一下,我按照你这种写法,然后调用了为什么没有效果呢?下划线还是有

    private class URLSpanNoUnderline extends URLSpan {
        public URLSpanNoUnderline(String url) {
            super(url);
        }
        @Override public void updateDrawState(TextPaint ds) {
            super.updateDrawState(ds);
            ds.setUnderlineText(false);
        }
    }

    private void stripUnderlines(TextView textView) {
        if(null!=textView&&textView.getText() instanceof Spannable){
            Spannable s = (Spannable)textView.getText();
            URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class);
            for (URLSpan span: spans) {
                int start = s.getSpanStart(span);
                int end = s.getSpanEnd(span);
                s.removeSpan(span);
                span = new URLSpanNoUnderline(span.getURL());
                s.setSpan(span, start, end, 0);
            }
            textView.setAutoLinkMask(0);//已经解决,添加这一句就好了
            textView.setText(s);
        }
    }
    
    //最后一行调用
     private void zero() {
        // 单独设置点击事件
        ClickableSpan clickableSpanOne = new ClickableSpan() {
            @Override
            public void onClick(View view) {
                Toast.makeText(Lingwulingyi.this, "点击了《用户协议和手册》", Toast.LENGTH_SHORT).show();
            }
        };
        ClickableSpan clickableSpanTwo = new ClickableSpan() {
            @Override
            public void onClick(View view) {
                Toast.makeText(Lingwulingyi.this, "点击了《网络使用协议》", Toast.LENGTH_SHORT).show();
            }
        };
        String content="请熟悉并阅读《用户协议和手册》相关内容阿《网络使用协议》斯顿发水立方举案说法阿萨德发送到打多少";
        SpannableString spannableString = new SpannableString(content);
//        spannableString.setSpan(new ForegroundColorSpan(Color.parseColor("#FF0000")),
        spannableString.setSpan(new ForegroundColorSpan(Color.parseColor("#00FF00")),
                6,15, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);//需要改变颜色的范围
//        spannableString.setSpan(new ForegroundColorSpan(Color.parseColor("#FF0000")),
        spannableString.setSpan(new ForegroundColorSpan(Color.parseColor("#00FF00")),
                20,28, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);//需要改变颜色的范围
        spannableString.setSpan(clickableSpanOne,
                6,15, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        spannableString.setSpan(clickableSpanTwo,
                20,28, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        // 不设置点击不生效
        mTextView.setMovementMethod(LinkMovementMethod.getInstance());
        mTextView.setText(spannableString);
        mTextView.setHighlightColor(Color.TRANSPARENT);//去掉点击效果,不加会默认点击有红色背景
        stripUnderlines(mTextView);  //去除下划线(无效)
    }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题