Better-Link-Movement-Method - 改善TextView中可点击链接

396 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Better-Link-Movement-Method是一个Android开源库, 用于提升TextView中可点击链接的探测, 高亮和响应.

视频效果:

EXAMPLE.gif

android:autoLinkLinkify.addLinks用于向TextView中添加链接, Android使用类LinkMovementMethod在链接获取焦点的时候来高亮链接, 并且在链接被点击的时候分发Intent.

BetterLinkMovementMethodLinkMovementMethod的基础之上, 通过修复以下缺陷进行提升:

  • 不支持自定义点击监听器. 例如, 电话号码总是在点击的时候展示在拨号器之上却没有方式对这种行为进行改变.
  • 错误的链接触摸区域计算, 导致触摸区域重影(视频).
  • 链接高亮不可靠(视频).

Usage

BetterLinkMovementMethod设计用来作为LinkMovementMethod的临时替换:

首先, 在工程或者模块的build.gradle文件中添加依赖:

dependencies {
  implementation 'me.saket:better-link-movement-method:2.2.0'
}

其次, 设置TextView#movementMethod:

val textView = findViewById(...)
Linkify.addLinks(textView, Linkify.ALL)
textView.movementMethod = BetterLinkMovementMethod.getInstance()

最后, 点击监听器的设置, 可以通过对每个TextView的独一无二的BetterLinkMovementMethod实例注册监听器:

textView.movementMethod = BetterLinkMovementMethod.newInstance().apply {
  setOnLinkClickListener { textView, url ->
    // Handle click or return false to let the framework handle this link.
    true
  }
  setOnLinkLongClickListener { textView, url ->
    // Handle long-click or return false to let the framework handle this link.
    true
  }

What's Linkify

Linkify接收文本和正则表达式, 将文本中所有匹配到的内容转化为可点击链接. 这在匹配像邮箱地址, 网页URL时尤其有用, 且将它们有响应. 除了要匹配的模式之外, URL scheme前缀也是需要的. 当创建可单击的URL时,任何不以提供的scheme开始的模式匹配都将在匹配文本前添加scheme. 例如, 如果你在匹配网页URL, 你将提供scheme http://. 在可点击URL创建的时候, 如果模式匹配了example.com, 它并没有URL scheme 前缀, 提供的scheme将会被添加到前面, 从而创建了example.com.

Linkify常量:

  • Linkify.WEB_URLS: 位字段,表示在采用选项掩码的方法中应匹配网页URL.
  • Linkify.EMAIL_ADDRESSES: 位字段,表示在采用选项掩码的方法中应匹配电子邮件地址
  • Linkify.PHONE_NUMBERS: 位字段,表示在采用选项掩码的方法中应匹配电话号码.
  • Linkify.MAP_ADDRESSES: 位字段,表示在采用选项掩码的方法中应匹配地图地址.