android textiew自定義ClickableSpan無效問題


我們有個需求,需要將一段文本中的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刪掉,這樣就可以執行到了。唉,踩了個大坑。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM