Android TextView with Clickable Links: how to capture clicks? Android TextView中的可点击链接:如何捕获点击事件?

6 浏览
0 Comments

Android TextView with Clickable Links: how to capture clicks? Android TextView中的可点击链接:如何捕获点击事件?

我有一个TextView,它可以渲染基本的HTML,包含2个以上的链接。我需要捕获链接的点击事件,并在我的内部WebView中打开这些链接(而不是在默认的浏览器中打开)。

处理链接渲染最常见的方法似乎是这样的:

String str_links = "GoogleFacebook";
text_view.setLinksClickable(true);
text_view.setMovementMethod(LinkMovementMethod.getInstance());
text_view.setText( Html.fromHtml( str_links ) );

然而,这会导致链接在默认的内部浏览器中打开(显示"Complete Action Using..."对话框)。

我尝试实现一个onClickListener,当链接被点击时会被正确触发,但我不知道如何确定点击了哪个链接...

text_view.setOnClickListener(new OnClickListener(){
    public void onClick(View v) {
        // 然后呢...?
    }
});

另外,我尝试创建一个自定义的LinkMovementMethod类并实现onTouchEvent...

public boolean onTouchEvent(TextView widget, Spannable text, MotionEvent event) {
    String url = text.toString();
    // 这不起作用,因为文本不一定是一个URL,甚至不一定是一个单独的链接...
    // 例如,我不知道如何从整段文本中提取被点击的链接
    return false;
}

有什么想法吗?


示例解决方案

我想出了一个解决方案,它从HTML字符串中解析链接并使它们可点击,然后让您对URL做出响应。

0
0 Comments

问题的原因是希望能够在Android的TextView中捕获可点击链接的点击事件。为了解决这个问题,提供了一个使用Kotlin编写的TextView的扩展函数,该函数可以通过为URLSpan元素应用新的回调函数来捕获URL链接的点击事件。使用这个扩展函数之前,需要确保已将带有链接的文本设置给TextView。扩展函数的具体实现是通过搜索文本中的所有URLSpan,并将其替换为自定义的ClickableSpan,并将点击事件转发给提供的函数。同时,还需要设置TextView的movementMethod属性为LinkMovementMethod.getInstance(),以确保链接可以被点击。调用这个扩展函数时,可以传入一个回调函数来处理点击事件。此外,还提供了一些额外的提示和建议,如使用HtmlCompat.fromHtml()方法设置TextView的文本,以及在点击事件触发之前调用Selection.setSelection()方法来取消选中状态。还提到了一个问题,即点击链接后无法实现重定向到浏览器的功能,这是因为在替换URLSpan时删除了原有的URLSpan导致的。

0
0 Comments

问题的出现原因:

这个问题的出现是因为在Android中使用TextView显示可点击的链接时,通过设置setMovementMethod(LinkMovementMethod.getInstance())和setText(Html.fromHtml(str_links))的方式无法实现点击链接后的提示动画或高亮效果。

解决方法:

为了在链接被点击时提供提示动画或高亮效果,可以尝试修改代码的执行顺序,先使用setText(Html.fromHtml(str_links)),然后再设置setMovementMethod(LinkMovementMethod.getInstance())。这样可以在点击链接后实现提示动画或高亮效果。

如果仅对超链接有效,而对包含电子邮件、电话号码等其他类型的文本不起作用,可以考虑使用StateList来实现。具体的实现方法可以参考developer.android.com/intl/pt-br/guide/topics/resources/drawable-resource.html#StateList。

在Android中,如果想要在TextView中显示可点击的链接并实现点击后的提示动画或高亮效果,可以先使用setText(Html.fromHtml(str_links)),然后再设置setMovementMethod(LinkMovementMethod.getInstance())。如果需要对非超链接文本也实现相同的效果,可以使用StateList来实现。

0
0 Comments

Android TextView中的可点击链接:如何捕获点击?这个问题的出现原因是想要在TextView中实现可点击的链接,并且能够捕获点击事件。解决方法是使用setTextViewHTML()函数解析HTML字符串中的链接并使其可点击,并且可以响应URL。具体代码如下:

protected void makeLinkClickable(SpannableStringBuilder strBuilder, final URLSpan span) {
    int start = strBuilder.getSpanStart(span);
    int end = strBuilder.getSpanEnd(span);
    int flags = strBuilder.getSpanFlags(span);
    ClickableSpan clickable = new ClickableSpan() {
        public void onClick(View view) {
            // 处理链接点击事件,可以使用span.getURL()获取链接内容...
        }
    };
    strBuilder.setSpan(clickable, start, end, flags);
    strBuilder.removeSpan(span);
}
protected void setTextViewHTML(TextView text, String html) {
    CharSequence sequence = Html.fromHtml(html);
    SpannableStringBuilder strBuilder = new SpannableStringBuilder(sequence);
    URLSpan[] urls = strBuilder.getSpans(0, sequence.length(), URLSpan.class);
    for (URLSpan span : urls) {
        makeLinkClickable(strBuilder, span);
    }
    text.setText(strBuilder);
    text.setMovementMethod(LinkMovementMethod.getInstance());
}

这个方法能够成功地实现可点击的链接,并且能够捕获点击事件。但是如果将它应用到ListView(即应用到每个元素的内部TextView)上,会导致列表无法点击,尽管链接仍然是可点击的。这是因为ListView中的View的focusable属性被设置为true。可以尝试在TextView上调用setFocusable(false)来解决这个问题。

如果不使用URLSpan,请确保使用text.setMovementMethod(LinkMovementMethod.getInstance())来设置TextView的MovementMethod。

有人将这些代码封装成了一个更简单的API,可以在https://github.com/bluecabin/Textoo上找到。

有人在使用AlertDialog的自定义视图时遇到了问题,需要在makeLinkClickable方法中添加setMovementMethod(LinkMovementMethod.getInstance())才能正常工作。

由于这个方法将URLSpan替换为ClickableSpan,因此无法使用Espresso来点击项目(例如ViewActions.openLinkWithText)。

最后,有人指出如果想要更改链接的高亮颜色,可以在TextView上使用android:textColorHighlight="yourColor"来设置颜色。

这段代码即使在xml中设置了android:textIsSelectable="true"也可以正常工作。非常感谢!

0