【问题标题】:The onClick() of ClickableSpan is not working for URLSpan?ClickableSpan 的 onClick() 不适用于 URLSpan?
【发布时间】:2012-02-06 17:15:50
【问题描述】:

在 TextView 中,我想在单击超链接时弹出一个 toast,而不是在浏览器中打开相应的 url。我使用以下代码,但这里的问题是 onClick() 方法似乎永远不会被调用!:

String source = "<a href=\"http://www.google.com\">link</a> ";

// Get SpannableStringBuilder object from HTML code
CharSequence sequence = Html.fromHtml(source, imgGetter, null);
SpannableStringBuilder strBuilder = new SpannableStringBuilder(sequence);

// Get an array of URLSpan from SpannableStringBuilder object
URLSpan[] urlSpans = strBuilder.getSpans(0, strBuilder.length(), URLSpan.class);

// Add onClick listener for each of URLSpan object
for (final URLSpan span : urlSpans) {
    int start = strBuilder.getSpanStart(span);
    int end = strBuilder.getSpanEnd(span);

    strBuilder.setSpan(new ClickableSpan()
    {
    @Override
    public void onClick(View widget) {
        Toast toast = Toast.makeText(context, "well done! you click " + span.getURL(), Toast.LENGTH_SHORT);
        toast.show();           
    }       
    }, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}

TextView t4 = (TextView) findViewById(R.id.text4);
t4.setText(strBuilder);
// No action if this is not set
t4.setMovementMethod(LinkMovementMethod.getInstance());

谁能告诉我我的代码有什么问题以及如何修复它?谢谢。

【问题讨论】:

    标签: android


    【解决方案1】:

    实际上我的前辈想通了,我们需要在使用 setSpan() 添加我们自己的跨度之前删除原始 URLSpan

        // The original URLSpan needs to be removed to block the behavior of browser opening
        strBuilder.removeSpan(span);
    

    谢谢达米安。

    【讨论】:

    • 在看到您的回复之前,我一直在编写解决方案。我昨天开始与这个问题作斗争。您的代码给出了关于我的问题的最后一条线索。
    • 不错。它适用于 removeSpan。这个解决方案是我一直在寻找的。谢谢
    猜你喜欢
    • 2016-10-24
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    相关资源
    最近更新 更多