删除下划线 - 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);
}
}
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());
如果你试图从资源中获取一个字符串,这不起作用,所以'String content = getResources()。getString(R.string.content);'包含一个链接不再起作用。 – 2015-08-03 20:01:05
这怎么可能?字符串不知道它来自哪里。字符串内容必须有所不同。 – 2015-08-04 11:03:28
不确定为什么,但是当我从'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);
这里,spannableText是SpannableString ...的对象! !
这是最好的解决方案,唯一为我工作的 – 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的是我的应用程序类在那里我把这个方法,这样我可以从任何地方
此解决方案假定跨度的文本访问相同的URL,这是基本http://链接的情况。但是,Linkify非常聪明,可以将电话号码(如(212)555-1212)转换为URL:tel:2125551212。 'new URLSpanNoUnderline'调用应该通过'span.getURL()'来保留这个信息,否则你生成的错误链接会在点击时导致异常。我已将这个建议的解决方案放在编辑队列中作为您的答案,因为我自己没有编辑权限。 – 2011-01-24 10:39:31
干杯迈克。我批准了你的编辑,第一次我见过*编辑对话框,希望它能工作。 – 2011-01-24 10:48:25
“范围的文本与URL相同”是什么意思? – 2011-03-24 11:24:14