我有一个文本视图,它可以包含如下链接https://www.google.com和超级链接与锚标签谷歌
现在,我已经在这个文本视图上添加了以下属性。
Linkify.addLinks(textview, Linkify.WEB_URLS);
textview.setMovementMethod(LinkMovementMethod.getInstance());
但是像这样的链接https://www.google.com这些都是蓝色的,并重定向到页面,但锚标签不是蓝色的,他们没有重定向它。
所以,我想让我的文本视图呈现两种类型的链接:直接链接和超链接。我该怎么做。
Linkify
(您调用它的方式)只知道转换实际上看起来像web URL的东西(即,它们以http或https开头,后面跟着冒号和两个斜杠等)。
如果你想将其他内容转换为链接,你必须向Linkify
添加更多的参数,让它更智能地转换你想要的内容。您可以创建MatchFilter和TransformFilter,然后调用Linkify.addLinks(TextView text, Pattern p, String scheme, Linkify.MatchFilter matchFilter, Linkify.TransformFilter transformFilter)
但在我看来,你想用一个像"谷歌"这样的词,并添加一个"https://www.google.com".这不是可以扫描的东西。为此,你需要使用SpannableStringBuilder
。你的代码可能看起来像这样:
String text = "This is a line with Google in it.";
Spannable spannable = new SpannableString(text);
int start = text.indexOf("Google");
int end = start + "Google".length();
URLSpan urlSpan = new URLSpan("https://www.google.com");
spannable.setSpan(urlSpan, start, end, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
textView.setText(spannable);
Linkify#addLinks(Spannable, Int)
的javadoc中提到:
如果掩码为非零,它还会删除附加到Spanable的任何现有URLSpan,以避免在同一文本上重复调用它时出现问题。
尽管您正在使用的Linkify#addLinks(TextView, Int)
中没有提到,但它们似乎遵循相同的行为,并且在linkify之前会删除现有链接(即您问题中的"锚标签")。
要解决问题并保留现有链接(在您的情况下为"chor标记"),您需要备份现有跨度(即TextView#getText
-->转换为跨度-->使用Spanned#getSpans
列出现有链接-->使用Spanned#getSpanStart
、Spanned#getSpanEnd
和Spanned#getSpanFlags
检索每个链接的设置)
linkify后,重新添加跨度(即TextView#getText
-->转换为Spannable
-->使用Spannable#setSpan
重新添加链接-->使用TextView#setText
设置回Spannable
)
根据您的情况,您可能还需要检查重叠的"锚标签"one_answers"链接化链接",并进行相应调整。。。
正如您所看到的,这是相当乏味和复杂的,并且代码容易出错。为了简化事情,我只是将所有这些合并到Textoo库中,以便重用和共享。使用Textoo,您可以通过以下方式实现相同目的:
TextView myTextView = Textoo
.config((TextView) findViewById(R.id.view_location_disabled))
.linkifyWebUrls()
.apply();
Textoo将保留现有链接,并链接所有不重叠的网址。
//the string to add links to
val htmlString = "This has anchors and urls http://google.com also <a href="http://google.com">Google</a>."
//Initial span from HtmlCompat will link anchor tags
val htmlSpan = HtmlCompat.fromHtml(htmlString, HtmlCompat.FROM_HTML_MODE_LEGACY) as Spannable
//save anchor links for later
val anchorTagSpans = htmlSpan.getSpans(0, htmlSpan.length, URLSpan::class.java)
//add first span to TextView
textView.text = htmlSpan
//Linkify will now make urls clickable but overwrite our anchor links
Linkify.addLinks(textView, Linkify.ALL)
textView.movementMethod = LinkMovementMethod.getInstance()
textView.linksClickable = true
//we will add back the anchor links here
val restoreAnchorsSpan = SpannableString(textView.text)
for (span in anchorTagSpans) {
restoreAnchorsSpan.setSpan(span, htmlSpan.getSpanStart(span), htmlSpan.getSpanEnd(span), Spanned.SPAN_INCLUSIVE_INCLUSIVE)
}
//all done, set it to the textView
textView.text = restoreAnchorsSpan