使用hyperLink android进行自动链接



我有一个文本视图,它可以包含如下链接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#getSpanStartSpanned#getSpanEndSpanned#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

相关内容

  • 没有找到相关文章

最新更新