我需要将相同的CharacterStyle附加到多个区域,所以我使用CharacterStyle.wrap()。然后,所有区域都带有下划线,但不能单击。
可能是什么原因?

 ssb.setSpan(CharacterStyle.wrap(clickableSpan), start, end, Spanned.SPAN_INCLUSIVE_INCLUSIVE);

最佳答案

这可能被视为Android框架中的错误。核心问题是方法SpannableStringBuilder.getSpans()的实现或应处理LinkMovementMethodClickableSpan的实现。

onTouchEvent()LinkMovementMethod implementation使用ClickableSpanSpannableStringBuilder请求所有getSpans()实例,这些实例基本上使用instanceof过滤其范围。但是问题是,如果您使用CharacterStyle.wrap(),则范围将不再是ClickableSpan实例,而是CharacterStyle.Passthrough实例。因此,getSpans()不再返回它,并且不再可单击。

请注意,文本外观(图形)不受此影响,因此它看起来仍然像ClickableSpan

现在,要解决此问题,您必须扩展SpannableStringBuilder来修复getSpans()实现(这太复杂了),或者扩展LinkMovementMethod.onTouchEvent()实现来手动过滤ClickableSpan。您可以找到一个example here,然后可以将其与

textview.setMovementMethod(new FixedLinkMovementMethod());


但是话又说回来,如果手动复制跨度为ClickableSpan而不是使用CharacterStyle.wrap(),也许会更容易。

07-24 21:33