【发布时间】:2012-04-08 18:42:26
【问题描述】:
我知道如果你把一个链接放在一个文本视图中它会起作用,但是如果我想显示例如:
谷歌 堆栈溢出
而不是整个链接(只是标签) 如何使这些链接可点击?
【问题讨论】:
-
这里有几个答案调用 Html.fromHtml,要么不使用 strings.xml 作为超文本,要么在 XML 中混淆超文本(例如,用“<”替换“
标签: android hyperlink textview
我知道如果你把一个链接放在一个文本视图中它会起作用,但是如果我想显示例如:
谷歌 堆栈溢出
而不是整个链接(只是标签) 如何使这些链接可点击?
【问题讨论】:
标签: android hyperlink textview
您可以有两个单独的 TextView,如果需要,您可以在布局中相应地对齐它们:
Text1.setText(
Html.fromHtml(
"<a href=\"http://www.google.com\">google</a> "));
Text1.setMovementMethod(LinkMovementMethod.getInstance());
Text2.setText(
Html.fromHtml(
"<a href=\"http://www.stackoverflow.com\">stackoverflow</a> "));
Text2.setMovementMethod(LinkMovementMethod.getInstance());
那么如果你想去掉“链接下划线”。创建一个类:
public class URLSpanNoUnderline extends URLSpan {
public URLSpanNoUnderline(String url) {
super(url);
}
@Override public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
}
}
然后在拥有 TextViews 的主 Activity 类中添加此方法
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);
}
然后在初始化 TextViews(在你的 onCreate 中)之后调用它:
stripUnderlines(Text1);
stripUnderlines(Text2);
【讨论】:
textView.setAutoLinkMask(0);
TextView t2 = (TextView) findViewById(R.id.textviewidname);
t2.setMovementMethod(LinkMovementMethod.getInstance());
和
<string name="google_stackoverflow"><a href="https://stackoverflow.com/questions/9852184/android-textview-hyperlink?rq=1">google stack overflow</a></string>
链接是“Android: textview hyperlink”
标签是“谷歌堆栈溢出”
在您的 java 中定义第一个代码块,在您的 strings.xml 文件中定义第二个代码块。另外,请务必从您的 java 页面布局中引用 textView 的 id。
【讨论】:
android:autoLink="web" 如果您的 HTML 中有完整链接,则可以正常工作。以下内容将以蓝色突出显示并可点击:
【讨论】:
非常简单的方法---
在你的活动中--
TextView tv = (TextView) findViewById(R.id.site);
tv.setText(Html.fromHtml("<a href=http://www.stackoverflow.com> STACK OVERFLOW "));
tv.setMovementMethod(LinkMovementMethod.getInstance());
那么你将只得到标签,而不是整个链接..
希望对你有帮助...
【讨论】:
这应该可以。
TextView t2 = (TextView) findViewById(R.id.text2);
t2.setMovementMethod(LinkMovementMethod.getInstance());
and
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="@string/txtCredits"
android:id="@+id/text2"
android:layout_centerInParent="true"
android:layout_marginTop="20dp"></TextView>
【讨论】:
这是我的工作实现
private void showMessage()
{
lblMessage.setText("");
List<String> messages = db.getAllGCMMessages();
for (int k = messages.size() - 1; k >= 0; --k)
{
String message = messages.get(k).toString();
lblMessage.append(message + "\n\n");
}
Linkify.addLinks(lblMessage, Linkify.ALL);
}
为了改变超链接的颜色,我为 textview 编辑了我的 xml -
android:textColorLink="#69463d"
【讨论】:
数据绑定呢?
@JvmStatic
@BindingAdapter("textHtml")
fun setHtml(textView: TextView, resource: String) {
val html: Spanned = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Html.fromHtml(resource, Html.FROM_HTML_MODE_COMPACT)
} else {
Html.fromHtml(resource)
}
textView.movementMethod = LinkMovementMethod.getInstance()
textView.text = html
}
字符串.xml
<string name="text_with_link"><a href=%2$s>%1$s</a> </string>
在你的 layout.xml 中
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:textHtml="@{@string/text_with_link(model.title, model.url)}"
tools:text="Some text" />
xml 中的标题和链接是一个简单的字符串
您还可以将多个参数传递给数据绑定适配器
@JvmStatic
@BindingAdapter(value = ["textLink", "link"], requireAll = true)
fun setHtml(textView: TextView, textLink: String?, link: String?) {
val resource = String.format(textView.context.getString(R.string.text_with_link, textLink, link))
val html: Spanned = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Html.fromHtml(resource, Html.FROM_HTML_MODE_COMPACT)
} else {
Html.fromHtml(resource)
}
textView.movementMethod = LinkMovementMethod.getInstance()
textView.text = html
}
并在 .xml 中分别传递参数
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:link="@{model.url}"
app:textLink="@{model.title}"
tools:text="Some text" />
【讨论】:
我遇到了同样的问题,终于找到了可行的解决方案。
在string.xml文件中,定义:
<string name="textWithHtml">The URL link is <a href="http://www.google.com">Google</a></string>
用 HTML 转义字符替换“
在 Java 代码中:
String text = v.getContext().getString(R.string.textWithHtml);
textView.setText(Html.fromHtml(text));
textView.setMovementMethod(LinkMovementMethod.getInstance());
TextBox 将正确显示带有可点击锚链接的文本
【讨论】:
使用
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:autoLink="web"
android:text="www.google.com" />
这个标志
autolink="网络"
控制是否自动找到url等链接并转换为可点击链接。默认值为“none”,禁用此功能。 值:全部、电子邮件、地图、无、电话、网络。
【讨论】: