美文网首页
TextView使用android:autoLink="

TextView使用android:autoLink="

作者: 苍蝇的梦 | 来源:发表于2018-05-22 16:43 被阅读348次

    2018-05-22 遇到的一点小问题

    android:textIsSelectable="true"

    项目里有个对话框,用来发布通知,刚好看到里面有个公众号ID,想复杂,但公司华为测试机的智能识屏特别难用,和锤子的Big Bang比起来差距不是一点半点。好吧,给TextView加个自由复制,xml里写上android:textIsSelectable="true",试了两个机子,能正常复制了。

    ClickableSpan
    android:autoLink="all"

    考虑到之后可能会在对话框里加链接或客服电话,所以接着在xml里写上android:autoLink="web|phone"
    链接文字变色,点击也能正常跳转了。

    ClickableSpan

    电话跳系统拨号界面没问题,但是链接需要跳转项目里自己的WebActivity,因为在项目的WebView里使用settings.setUserAgentString(settings.getUserAgentString() + " wannoo");添加了标识,这样前端在一些特殊界面可以做特殊处理。为了这个就需要自定义ClickableSpan来处理点击事件了。
    这个网上很多,照着写就行了。

    class NoticeClickableSpan extends ClickableSpan {
            private String url;
            NoticeClickableSpan(String url) {
                this.url = url;
            }
    
          Override
          public void onClick(View widget) {
                Log.e("wannoo", "__这里处理点击事件__" + url);
          }
    }
    

    先自定义ClickableSpan然后再设置

    CharSequence text = mTextMe.getText();
    if (!text instanceof Spannable) {
         return; 
    }
    Spannable sp = (Spannable) text;
    URLSpan urls[] = sp.getSpans(0, sp.length(), URLSpan.class);
    SpannableStringBuilder style = new SpannableStringBuilder(text);
    style.clearSpans();
    for (URLSpan url : urls) {
          NoticeClickableSpan myURLSpan = new NoticeClickableSpan(p.context, url.getURL());
          int spanStart = sp.getSpanStart(url);
          int spanEnd = sp.getSpanEnd(url);
          style.setSpan(myURLSpan, spanStart, spanEnd, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
    }
    mTextMe.setText(style);
    
    LinkMovementMethod

    设置后能正常拦截点击事件了,不过在设置多个链接时出现问题了。第一次点击时无效,再次点击才生效,不过点击时打印的url是上一次的,存在莫名其妙的延迟。不知道是不是只有我的会这样,网上没找到相关的问题描述。只好再找找有关ClickableSpan的文章,看到一个全面一点的。里面有讲到LinkMovementMethod相关。
    再代码最后面加上mTextMe.setMovementMethod(new LinkMovementMethod());。试了下,没有延迟了,不过点击一次却打印了两次。点进去看了下android.text.method.LinkMovementMethod,然后他在第216行有一句links[0].onClick(widget);。猜测是因为这个引起的。
    自定义继承LinkMovementMethod重写onTouchEvent方法,一大堆代码拷过来,然后只是把links[0].onClick(widget);删掉。然后在代码最后面加上

    mTextMe.setMovementMethod(new NoticeLinkMovementMethod());
    

    试了下,能正常拦截,而且只打印一次。

    android:layout_width="wrap_content"

    正常是点击有超链接才能有点击事件,点击其他部分是没有的。不过很不巧,我的点击其他也是有的,网上找了下,按要求将TextView的宽高改了下,android:layout_width="wrap_content"。大部分是正常了,但当我将链接放在最后面又没有以空格结尾,就还好出现其它字符点击也有反应的事。好吧,为了省事,都在末尾加上空格" "。这样子测了下,没问题了。

    updateDrawState

    网上找的都是说在自定义的ClickableSpan里重写updateDrawState(TextPaint ds)方法,然后就能自定义可点击部分的颜色以及是否有下划线。想着也是闲着,那就试试吧。但是当我把ds.setColor(Color.RED);ds.setUnderlineText(false);写下去时却没有生效。方法能正常进去,但是设置却没有效果。试了一下在方法里面使用ds.linkColor = Color.RED;能把字体颜色改成红色了,但是android.text.TextPaint里和underline有关的属性int underlineColor以及float underlineThickness都是标记@hide,没办法直接修改。
    试了不少办法,依然没法解决,也不清楚问题出在哪里。算了,不管了,现在项目暂时没这需求,等遇到再换别的方法试试看。上面写的那些可能都不对,只是正好瞎猫碰上死耗子,功能实现了。先记录一下,下次真闲着再看看。

    相关文章

      网友评论

          本文标题:TextView使用android:autoLink="

          本文链接:https://www.haomeiwen.com/subject/zpkhjftx.html