我需要将相同的CharacterStyle
附加到多个区域,所以我使用CharacterStyle.wrap()
。然后,所有区域都带有下划线,但不能单击。
可能是什么原因?
ssb.setSpan(CharacterStyle.wrap(clickableSpan), start, end, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
最佳答案
这可能被视为Android框架中的错误。核心问题是方法SpannableStringBuilder.getSpans()
的实现或应处理LinkMovementMethod
的ClickableSpan
的实现。onTouchEvent()
的LinkMovementMethod
implementation使用ClickableSpan
从SpannableStringBuilder
请求所有getSpans()
实例,这些实例基本上使用instanceof
过滤其范围。但是问题是,如果您使用CharacterStyle.wrap()
,则范围将不再是ClickableSpan
实例,而是CharacterStyle.Passthrough
实例。因此,getSpans()
不再返回它,并且不再可单击。
请注意,文本外观(图形)不受此影响,因此它看起来仍然像ClickableSpan
。
现在,要解决此问题,您必须扩展SpannableStringBuilder
来修复getSpans()
实现(这太复杂了),或者扩展LinkMovementMethod.onTouchEvent()
实现来手动过滤ClickableSpan
。您可以找到一个example here,然后可以将其与
textview.setMovementMethod(new FixedLinkMovementMethod());
但是话又说回来,如果手动复制跨度为
ClickableSpan
而不是使用CharacterStyle.wrap()
,也许会更容易。