android textiew自定义ClickableSpan无效问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了android textiew自定义ClickableSpan无效问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2302字,纯文字阅读大概需要4分钟。
内容图文
![android textiew自定义ClickableSpan无效问题](/upload/InfoBanner/zyjiaocheng/1085/4b9dce2dd32b43e0b2844bef4a2c66ee.jpg)
我们有个需求,需要将一段文本中的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); } elseif (action == MotionEvent.ACTION_DOWN) { Selection.setSelection(buffer, buffer.getSpanStart(link[0]), buffer.getSpanEnd(link[0])); } returntrue; } else { Selection.removeSelection(buffer); } } returnsuper.onTouchEvent(widget, buffer, event); }
绿色部分,当你点击textview中的某个urlspan时,LinkMovementMethoid会把所有的span都取出来放到一个数组里,然后执行第一个span的click事件,而我上面代码里设置的自定义的span,是在数组第二个的位置上,所以根本执行不到。我也纳闷明明已经setSpan了,为什么没有替换掉呢。
解决办法就是setSpan后把原来的urlspan删掉,这样就可以执行到了。唉,踩了个大坑。
原文:https://www.cnblogs.com/wangyuehome/p/9989213.html
内容总结
以上是互联网集市为您收集整理的android textiew自定义ClickableSpan无效问题全部内容,希望文章能够帮你解决android textiew自定义ClickableSpan无效问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。