1. 程式人生 > >android textiew自定義ClickableSpan無效問題

android textiew自定義ClickableSpan無效問題

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 instanceof
Spannable) { 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無效問題