首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >带有可点击链接的Android TextView :如何捕获点击?

带有可点击链接的Android TextView :如何捕获点击?
EN

Stack Overflow用户
提问于 2012-09-14 12:46:31
回答 7查看 107.5K关注 0票数 139

我有一个呈现基本超文本标记语言的TextView,其中包含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 ) );

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

我尝试实现了一个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,它可以解析出超文本标记语言字符串中的链接,并使它们可被点击,然后让您响应URL。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-11-15 06:22:32

下面是一个基于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());       
}
票数 255
EN

Stack Overflow用户

发布于 2013-09-05 08:31:43

您已经完成了以下操作:

text_view.setMovementMethod(LinkMovementMethod.getInstance());
text_view.setText( Html.fromHtml( str_links ) );

您是否按如下所示的相反顺序尝试过?

text_view.setText( Html.fromHtml( str_links ) );
text_view.setMovementMethod(LinkMovementMethod.getInstance());

如果没有:

text_view.setLinksClickable(true);
票数 23
EN

Stack Overflow用户

发布于 2012-10-09 20:02:45

我也遇到过同样的问题,但有很多文本,几乎没有链接和电子邮件。我认为使用'autoLink‘是一种更简单、更简洁的方式:

  text_view.setText( Html.fromHtml( str_links ) );
  text_view.setLinksClickable(true);
  text_view.setAutoLinkMask(Linkify.ALL); //to open links

如果只想使用或在XML布局中设置其中一个,则可以设置Linkify.EMAIL_ADDRESSES或Linkify.WEB_URLS

  android:linksClickable="true"
  android:autoLink="web|email"

可用选项包括:无、web、电子邮件、电话、地图、全部

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12418279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档