TextView使用android:autoLink="

2018-05-22  本文已影响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,没办法直接修改。
试了不少办法,依然没法解决,也不清楚问题出在哪里。算了,不管了,现在项目暂时没这需求,等遇到再换别的方法试试看。上面写的那些可能都不对,只是正好瞎猫碰上死耗子,功能实现了。先记录一下,下次真闲着再看看。

上一篇下一篇

猜你喜欢

热点阅读