android textiew自定義ClickableSpan無效問題
阿新 • • 發佈:2018-11-20
pre col pri andro method [] 一個數 buffer selection
我們有個需求,需要將一段文本中的url跳轉,替換成跳轉我們app的某個頁面。然後就開始搞,先自定義clickspan,在設置LinkMovementMethoid,
但是不管怎麽搞就是不生效.
這是我的代碼,紅色部分是解決問題的方法:
/** * 攔截超鏈接 * @param tv */ private void interceptHyperLink(TextView tv,String content) { CharSequence text = Html.fromHtml(content); if (text instanceofSpannable) { int end = text.length(); Spannable spannable = (Spannable) text; URLSpan[] urlSpans = spannable.getSpans(0, end, URLSpan.class); SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(text); // 循環遍歷並攔截 所有http://開頭的鏈接 for (URLSpan uri : urlSpans) { String url = uri.getURL(); if (url.indexOf("http://") == 0 || url.indexOf("https://")==0) { CustomUrlSpan customUrlSpan = new CustomUrlSpan(getContext(), url, mIFragment); spannableStringBuilder.setSpan(customUrlSpan, spannableStringBuilder.getSpanStart(uri), spannableStringBuilder.getSpanEnd(uri), Spannable.SPAN_INCLUSIVE_INCLUSIVE); spannableStringBuilder.removeSpan(uri);//解決方法} } tv.setText(spannableStringBuilder); tv.setMovementMethod(LinkMovementMethod.getInstance()); } }
後來仔細查看了下LinkMovementMethoid的代碼,在ontouchevent方法裏是這麽寫的。
@Override public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) { int action = event.getAction(); if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) { int x = (int) event.getX(); int y = (int) event.getY(); x -= widget.getTotalPaddingLeft(); y -= widget.getTotalPaddingTop(); x += widget.getScrollX(); y += widget.getScrollY(); Layout layout = widget.getLayout(); int line = layout.getLineForVertical(y); int off = layout.getOffsetForHorizontal(line, x); ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class); if (link.length != 0) { if (action == MotionEvent.ACTION_UP) { link[0].onClick(widget); } else if (action == MotionEvent.ACTION_DOWN) { Selection.setSelection(buffer, buffer.getSpanStart(link[0]), buffer.getSpanEnd(link[0])); } return true; } else { Selection.removeSelection(buffer); } } return super.onTouchEvent(widget, buffer, event); }
綠色部分,當你點擊textview中的某個urlspan時,LinkMovementMethoid會把所有的span都取出來放到一個數組裏,然後執行第一個span的click事件,而我上面代碼裏設置的自定義的span,是在數組第二個的位置上,所以根本執行不到。我也納悶明明已經setSpan了,為什麽沒有替換掉呢。
解決辦法就是setSpan後把原來的urlspan刪掉,這樣就可以執行到了。唉,踩了個大坑。
android textiew自定義ClickableSpan無效問題