带有可点击链接的 Android TextView : how to capture clicks?

标签 android hyperlink textview

我有一个 TextView,它呈现基本的 HTML,包含 2 个以上的链接。我需要捕获对链接的点击并打开链接——在我自己的内部 WebView 中(而不是在默认浏览器中)。

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

String str_links = "<a href='http://google.com'>Google</a><br /><a href='http://facebook.com'>Facebook</a>";
text_view.setLinksClickable(true);
text_view.setMovementMethod(LinkMovementMethod.getInstance());
text_view.setText( Html.fromHtml( str_links ) );

但是,这会导致链接在默认的内部网络浏览器中打开(显示“使用...完成操作”对话框)。

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

text_view.setOnClickListener(new OnClickListener(){

    public void onClick(View v) {
        // what now...?
    }

});

或者,我尝试创建自定义 LinkMovementMethod 类并实现 onTouchEvent...

public boolean onTouchEvent(TextView widget, Spannable text, MotionEvent event) {
    String url = text.toString();
    // this doesn't work because the text is not necessarily a URL, or even a single link... 
    // eg, I don't know how to extract the clicked link from the greater paragraph of text
    return false;
}

想法?


示例解决方案

我想出了 a solution它从 HTML 字符串中解析链接并使其可点击,然后让您响应 URL。

最佳答案

基于 another answer ,这里有一个函数 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) {
            // Do something with span.getURL() to handle the link click...
        }
    };
    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());       
}

关于带有可点击链接的 Android TextView : how to capture clicks?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12418279/

相关文章:

安卓 : camera doesn't open in marshmallow

javascript - 如何在不在浏览器中打开新窗口/标签的情况下打开 `tel:+48123` 链接客户端

android - TextView - 获取可见文本,以及如何将字符串划分为页面?

javascript - 连接变量和函数名称

c++ - 奇怪的场景得到 g++ 错误函数的多重定义

java - 显示 R.java 资源 ID 的 TextView

android - 在同一 TextView 中更改问题并获取选项

java - 应用程序崩溃 SQLite DB 处理程序

android - 遍历 JSONObject

android - 在应用程序级别初始化 Fabric 和 Crashlytics 有什么缺点吗?