删除下划线 - Android电子

问题描述:

我用两个textview显示来自数据库的链接,我设法改变链接的颜色,但我想删除下划线删除下划线 - Android电子

email.setText(c.getString(5)); 
    website.setText(c.getString(6)); 
    Linkify.addLinks(email, Linkify.ALL); 
    Linkify.addLinks(website, Linkify.ALL); 

我能做到这一点从XML或代码?

您可以在代码中使用不带下划线的版本查找并替换URLSpan实例。你叫Linkify.addLinks()后,呼吁每个TextView S的下面粘贴的功能stripUnderlines()

private void stripUnderlines(TextView textView) { 
     Spannable s = new SpannableString(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.setText(s); 
    } 

这需要URLSpan的定制版本,不启用TextPaint的“下划线”属性:

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

此解决方案假定跨度的文本访问相同的URL,这是基本http://链接的情况。但是,Linkify非常聪明,可以将电话号码(如(212)555-1212)转换为URL:tel:2125551212。 'new URLSpanNoUnderline'调用应该通过'span.getURL()'来保留这个信息,否则你生成的错误链接会在点击时导致异常。我已将这个建议的解决方案放在编辑队列中作为您的答案,因为我自己没有编辑权限。 – 2011-01-24 10:39:31

+0

干杯迈克。我批准了你的编辑,第一次我见过*编辑对话框,希望它能工作。 – 2011-01-24 10:48:25

+0

“范围的文本与URL相同”是什么意思? – 2011-03-24 11:24:14

UnderlineSpan已经存在,但只能设置下划线。

另一种解决方案是在每个现有的URLSpan上添加一个无下划线范围。因此,下划线状态在绘画之前被禁用。通过这种方式,您可以将URLSpan(可能是自定义)类和其他所有样式设置在别处。

public class NoUnderlineSpan extends UnderlineSpan { 
    public NoUnderlineSpan() {} 

    public NoUnderlineSpan(Parcel src) {} 

    @Override 
    public void updateDrawState(TextPaint ds) { 
     ds.setUnderlineText(false); 
    } 
} 

这里是你如何设置而不删除现有的URLSpan对象:

URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class); 
for (URLSpan span: spans) { 
    int start = s.getSpanStart(span); 
    int end = s.getSpanEnd(span); 
    NoUnderlineSpan noUnderline = new NoUnderlineSpan(); 
    s.setSpan(noUnderline, start, end, 0); 
} 

给出一个TextView和内容:

TextView textView = (TextView) findViewById(R.id.your_text_view_id); 
String content = "your <a href='http://some.url'>html</a> content"; 

这里是删除从超链接下划线一个简洁的方式:

Spannable s = (Spannable) Html.fromHtml(content); 
for (URLSpan u: s.getSpans(0, s.length(), URLSpan.class)) { 
    s.setSpan(new UnderlineSpan() { 
     public void updateDrawState(TextPaint tp) { 
      tp.setUnderlineText(false); 
     } 
    }, s.getSpanStart(u), s.getSpanEnd(u), 0); 
} 
textView.setText(s); 

这是基于robUx4建议的方法。

为了使链接点击,你还需要调用:

textView.setMovementMethod(LinkMovementMethod.getInstance()); 
+3

如果你试图从资源中获取一个字符串,这不起作用,所以'String content = getResources()。getString(R.string.content);'包含一个链接不再起作用。 – 2015-08-03 20:01:05

+0

这怎么可能?字符串不知道它来自哪里。字符串内容必须有所不同。 – 2015-08-04 11:03:28

+0

不确定为什么,但是当我从'res/values/strings.xml'中调用字符串时它不显示url,它包含与示例完全相同的内容。你可以测试你的最终? – 2015-08-04 13:24:00

无论何时,尽量删除网址强调与spannable是我建议只有这些东西:

1>创建定制类:

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

这需要定制版本URLSpan不与spannable文本启用TextPaint的 “下划线” 属性

2>setSpan:

spannableText.setSpan(new URLSpanNoUnderline(UrlText), 0, UrlText.length() , 0); 

这里,spannableTextSpannableString ...的对象! !

+0

这是最好的解决方案,唯一为我工作的 – GuilhE 2015-06-25 10:17:00

public void setView() 
{ 
TextView t=(TextView) findViewById(R.id.textView3); 
     t.setText(Html.fromHtml("<a href=http://www.urdusms.net > UrduSMS ")); 
     t.setTextColor(Color.BLACK); 
     t.setGravity(Gravity.CENTER); 
     t.setMovementMethod(LinkMovementMethod.getInstance()); 

     Spannable s = (Spannable) t.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 URLSpanline_none(span.getURL()); 
       s.setSpan(span, start, end, 0); 
      } 
     t.setText(s); 
} 
//inner class is  
private class URLSpanline_none extends URLSpan { 
      public URLSpanline_none(String url) { 
       super(url); 
      } 
      @Override public void updateDrawState(TextPaint ds) { 
       super.updateDrawState(ds); 
       ds.setUnderlineText(false); 
      } 
     } 

我已经实现了一个解决方案,在我看来,更优雅。我做了一个定制TextView。这样你就不需要为每个带有超链接的TextView执行额外的代码。

package com.example.view; 

import android.content.Context; 
import android.support.v7.widget.AppCompatTextView; 
import android.text.Spannable; 
import android.text.SpannableString; 
import android.text.style.URLSpan; 
import android.util.AttributeSet; 

import com.example.utils.UrlSpanNoUnderline; 

public class TextViewNoUnderline extends AppCompatTextView { 
    public TextViewNoUnderline(Context context) { 
     this(context, null); 
    } 

    public TextViewNoUnderline(Context context, AttributeSet attrs) { 
     this(context, attrs, android.R.attr.textViewStyle); 
    } 

    public TextViewNoUnderline(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     setSpannableFactory(Factory.getInstance()); 
    } 

    private static class Factory extends Spannable.Factory { 
     private final static Factory sInstance = new Factory(); 

     public static Factory getInstance() { 
      return sInstance; 
     } 

     @Override 
     public Spannable newSpannable(CharSequence source) { 
      return new SpannableNoUnderline(source); 
     } 
    } 

    private static class SpannableNoUnderline extends SpannableString { 
     public SpannableNoUnderline(CharSequence source) { 
      super(source); 
     } 

     @Override 
     public void setSpan(Object what, int start, int end, int flags) { 
      if (what instanceof URLSpan) { 
       what = new UrlSpanNoUnderline((URLSpan) what); 
      } 
      super.setSpan(what, start, end, flags); 
     } 
    } 
} 

和代码UrlSpanNoUnderline:

package com.jankstudios.smmagazine.utils; 

import android.text.TextPaint; 
import android.text.style.URLSpan; 

public class UrlSpanNoUnderline extends URLSpan { 
    public UrlSpanNoUnderline(URLSpan src) { 
     super(src.getURL()); 
    } 

    @Override 
    public void updateDrawState(TextPaint ds) { 
     super.updateDrawState(ds); 
     ds.setUnderlineText(false); 
    } 
} 

如果你只是想文本,不操心的URL链接

这将STRIP链接,但KEEP文字

private Spannable stripLinks(String content) { 
    Spannable s = new SpannableString(content); 
    URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class); 
    for (URLSpan span : spans) { 
     s.removeSpan(span); 
    } 

    return s; 
} 

没有其他类需要

String content = "<a href='http://*.com'>Stack Overflow</a> Rocks!"; 
textView.setText(stripLinks(content)); 

如果您正在使用的TextView自动连接属性和要删除强调必须把你可以使用它:

首先,扩展UnderlineSpan和删除下划线:

public class NoUnderlineSpan extends UnderlineSpan { 

    @Override 
    public void updateDrawState(TextPaint ds) { 
     ds.setUnderlineText(false); 
    } 
} 

其次,创建并实例化NoUnderlineSpan,从String文本创建一个Spannable并将跨度设置为可跨越:

NoUnderlineSpan mNoUnderlineSpan = new NoUnderline(); 
if (yourTextView.getText() instanceof Spannable) { 
    Spannable s = (Spannable) yourTextView.getText(); 
    s.setSpan(mNoUnderlineSpan, 0, s.length(), Spanned.SPAN_MARK_MARK); 
} 

参考:http://prog3.com/sbdm/blog/maosidiaoxian/article/details/39156563

下划线在机器人:textAllCaps = “真”机器人::textIsSelectable = “假”

<TextView 
    android:autoLink="phone" 
    android:text="070 300 1155" 
    android:textAllCaps="true" 
    android:textIsSelectable="false" 
    /> 

下面是自动链接可使用机器人被移除我的方法

public static void removeUnderlines(Spannable p_Text) { 
      if (p_Text != null && p_Text.toString().length() > 0) { 
       URLSpan[] spans = p_Text.getSpans(0, p_Text.length(), URLSpan.class); 

       for (URLSpan span : spans) { 
        int start = p_Text.getSpanStart(span); 
        int end = p_Text.getSpanEnd(span); 
        p_Text.removeSpan(span); 
        span = new URLSpanNoUnderline(span.getURL()); 
        p_Text.setSpan(span, start, end, 0); 
       } 
      } 
     } 

这样称呼它

AppController.removeUnderlines((Spannable) eventEmail.getText()); 

AppController的是我的应用程序类在那里我把这个方法,这样我可以从任何地方