SpannableStringBuilder不止一次设置ClickableSpan,无法点击

时间:2015-04-08 03:53:02

标签: android

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

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

1 个答案:

答案 0 :(得分:2)

这可能是Android框架中的错误。核心问题是方法SpannableStringBuilder.getSpans()的实施或应处理ClickableSpan的{​​{3}}的实施。

LinkMovementMethod的{​​{3}}请ClickableSpan SpannableStringBuilderinstanceofCharacterStyle.wrap()个实例ClickableSpan基本上使用CharacterStyle.Passthrough过滤其跨度。但问题是,如果您使用getSpans(),则您的范围不再是ClickableSpan实例,而是SpannableStringBuilder实例。因此getSpans()不再返回它,它不再可点击。

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

现在,要解决此问题,您必须扩展ClickableSpan以修复textview.setMovementMethod(new FixedLinkMovementMethod()); 实施(过于复杂),或者扩展ClickableSpan实施以过滤{{1手动。您可以找到LinkMovementMethod然后可以与

一起使用
CharacterStyle.wrap()

但话又说回来,如果它是player.loadVideoById(videoId) 而不是var player; function onYouTubeIframeAPIReady() { player = new YT.Player('player', { height: '390', width: '640', videoId: 'M7lc1UVf-VE', playerVars: { 'loop' : 1, 'playlist': 'M7lc1UVf-VE' }, events: { 'onReady': onPlayerReady, 'onStateChange': onPlayerStateChange } }); } ,那么手动复制跨度可能会更容易。