我正在使用一个Activity来解析带有标记字符的文本.
我正在做的是将它们转换为几种类型的ClickableSpans.
问题是我需要实现一个函数(让我们称之为函数B),这意味着有重叠的ClickableSpans并导致一些问题.
所以我现在正在做的是在检测重叠跨度的同时创建一个新的SSB,并删除我不需要这个特定功能的SSB.工作正常.
但是,我需要能够回到之前的SSB,这似乎不起作用.
一步步:
// I CREATE THE SSBs
...
static SpannableStringBuilder ssb;
static SpannableStringBuilder ssbcopy;
// I IMPLEMENT MY CUSTOM FUNCTION THAT PARSES THE TEXT AND SETS THE SBB AS A TEXTVIEW CONTENT
...
textView.setMovementMethod(new LinkTouchMovementMethod());
ssb = addClickablePart(chapterTextStr,markupCharactersArray);
textView.setText(ssb);
// WHEN A BUTTON IS CLICKED I IMPLEMENT MY FUNCTION B. WHERE I CREATE A copY OF MY ORIGINAL SSB AND STORE IT IN ssbcopy,AND SET IT AS THE TEXTVIEW CONTENT
...
ssbcopy = SpannableStringBuilder.valueOf(ssb);
// I REMOVE THE OVERLAPPING SPANS
...
overlapSpans = ssbcopy.getSpans(index,index+word.length(),TouchableSpan.class);
for (int c=0;ccopy.removeSpan(overlapSpans[c]);
}
// I SET THE NEW CLICKABLE SPANS
...
ssbcopy.setSpan(touchableSpan,index,index + word.length(),0);
// AND SET THE NEW SSB CONTENT TO THE TEXTVIEW
textView.setText(ssbcopy);
// EVERYTHING WORKS FINE UP TO HERE
// BUT WHEN I TRY TO SET BACK THE ORIGINAL SSB BACK AS THE CONTENT OF MY TEXTVIEW WHEN THE USER CLICKS A BUTTON
...
textView.setText(ssb);
// THE ORIGINAL SSB IS EXACTLY LIKE THE copY (ssbcopy) AND CONTAINS THE SAME CLICKABLE SPANS I ADDED. NOT ONLY THE ORIGINAL Ones
我想这听起来有点令人困惑,我不确定我是否正确解释,但我不能解决这个问题.
编辑:
根据kcoppock的回答,我知道克隆ssb是不可能的,而valueOf(ssb)只是对象的副本.
所以我最终通过循环遍历所有元素并将它们应用到新的ssb来手动克隆我的“ssb”.像这样:
TouchableSpan[] spans = ssb.getSpans(0,ssb.length(),TouchableSpan.class);
ssbcopy = new SpannableStringBuilder(chapterTextStr+"dsadsa");
for (int c=0;ccopy.setSpan(obj,ssb.getSpanStart(obj),ssb.getSpanEnd(obj),0);
}
顺便说一句,TouchableSpan是我创建的自定义类,它扩展了ClickableSpan
最佳答案
这里的问题是你使用valueOf().它没有做你认为它做的事情.它所做的就是返回传入的对象,如果它是SpannableStringBuilder;否则,它将给定的CharSequence包装在SpannableStringBuilder中.从来源:
public static SpannableStringBuilder valueOf(CharSequence source) {
if (source instanceof SpannableStringBuilder) {
return (SpannableStringBuilder) source;
} else {
return new SpannableStringBuilder(source);
}
}
基本上:
ssb == SpannableStringBuilder.valueOf(ssb);
它们是同一个对象. SpannableStringBuilder没有实现Cloneable,因此除了生成两个副本之外,没有简单的方法来制作副本,例如:
ssb = addClickablePart(chapterTextStr,markupCharactersArray);
ssbcopy = addClickablePart(chapterTextStr,markupCharactersArray);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。