2012-02-06 55 views
13

在TextView中,我希望在單擊超鏈接時彈出一個Toast,而不是在瀏覽器中打開相應的URL。我使用下面的代碼,但這裏的問題是的onClick()方法似乎從來沒有被稱爲!!:ClickableSpan的onClick()不適用於URLSpan?

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()); 

誰能告訴我什麼是錯我的代碼,以及如何解決它?謝謝。

回答

18

其實我的高級想通了,我們需要將我們自己的使用setSpan()跨度

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

感謝達米安之前刪除原始URLSpan。

+0

我一直在寫解決方案,直到我看到您的回覆。我昨天開始與這個問題作鬥爭。你的代碼給出了我的問題的最後線索。 – raultm 2012-04-17 11:00:46

+0

不錯。它適用於removeSpan。這個解決方案就是我一直在尋找的。謝謝 – 2016-01-28 17:26:07

相關問題