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

我有一个呈现基本HTML的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浏览器中打开(显示“使用...完成操作”对话框)。


我尝试实现一个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;

}

有想法吗?


解决方案示例

我想出了一种解决方案,可以解析HTML字符串中的链接并使它们可单击,然后让您响应URL。


温温酱
浏览 788回答 3
3回答

喵喵时光机

根据另一个答案,这是一个函数setTextViewHTML(),该函数将从HTML字符串中解析出链接,并使它们可单击,然后让您响应URL。protected void makeLinkClickable(SpannableStringBuilder strBuilder, final URLSpan span){&nbsp; &nbsp; int start = strBuilder.getSpanStart(span);&nbsp; &nbsp; int end = strBuilder.getSpanEnd(span);&nbsp; &nbsp; int flags = strBuilder.getSpanFlags(span);&nbsp; &nbsp; ClickableSpan clickable = new ClickableSpan() {&nbsp; &nbsp; &nbsp; &nbsp; public void onClick(View view) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Do something with span.getURL() to handle the link click...&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; };&nbsp; &nbsp; strBuilder.setSpan(clickable, start, end, flags);&nbsp; &nbsp; strBuilder.removeSpan(span);}protected void setTextViewHTML(TextView text, String html){&nbsp; &nbsp; CharSequence sequence = Html.fromHtml(html);&nbsp; &nbsp; SpannableStringBuilder strBuilder = new SpannableStringBuilder(sequence);&nbsp; &nbsp; URLSpan[] urls = strBuilder.getSpans(0, sequence.length(), URLSpan.class);&nbsp; &nbsp;&nbsp; &nbsp; for(URLSpan span : urls) {&nbsp; &nbsp; &nbsp; &nbsp; makeLinkClickable(strBuilder, span);&nbsp; &nbsp; }&nbsp; &nbsp; text.setText(strBuilder);&nbsp; &nbsp; text.setMovementMethod(LinkMovementMethod.getInstance());&nbsp; &nbsp; &nbsp; &nbsp;}

有只小跳蛙

您已完成以下操作: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);
打开App,查看更多内容
随时随地看视频慕课网APP