android TextView中ClickableSpan与文本自由复制(TextIsSelectable)冲突问题

本文探讨了在Android中,当TextView同时使用ClickableSpan实现超链接和通过textIsSelectable允许文本自由复制时遇到的问题。点击超链接首次打开错误网址,第二次才正确。分析了TextView的onTouchEvent源码,指出两者冲突在于 MovementMethod。解决方案是保留textIsSelectable,自定义TextView的onTouchEvent方法,重写处理超链接点击,从而兼顾文本复制和超链接功能。
摘要由CSDN通过智能技术生成

上一篇文章解决了UrlSpan与文本中url链接识别和设置的问题,超链接可以正常显示了。但由于用户期望TextView中的文章内容可以自由复制,这个需求嘛实现起来就是设置下textView.setTextIsSelectable(true)就可以了。

天真的以为没啥问题,版本转测。立马出现一个严重问题,第一次点击超链接打开的网址与实际不符,第二次点击超链接才能打开正确的网址,或者说每次点击超链接文本打开的网址都是上一次点击区域内的超链接url。

贴TextView::onTouchEvent的源码

01     @Override
02     public boolean onTouchEvent(MotionEvent event) {
03         。。。
04         final boolean superResult = super.onTouchEvent(event);
05          if ((mMovement != null || onCheckIsTextEditor()) && isEnabled()
06                 && mText instanceof Spannable && mLayout != null) {
07             boolean handled = false;
08  
09             if (mMovement != null) {
10                 handled |= mMovement.onTouchEvent(this, (Spannable) mText, event);
11             }
12  
13             if (touchIsFinished && mLinksClickable && mAutoLinkMask != 0 && mTextIsSelectable) {
14                 // The LinkMovementMethod which should handle taps on links has not been installed
15                 // on non editable text that support text selection.
16                 // We reproduce its behavior here to open links for these.
17                 ClickableSpan[] links = ((Spannable) mText).getSpans(getSelectionStart(),
18                         getSelectionEnd(), ClickableSpan.class);
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值