gpt4 book ai didi

java - 克隆 SpannableStringBuilder

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:31:47 24 4
gpt4 key购买 nike

我正在处理一个 Activity ,在该 Activity 中我解析带有标记字符的文本。我正在做的是将它们转换为几种类型的 ClickableSpans。

问题是我需要实现一个函数(我们称之为函数 B),这意味着具有重叠的 ClickableSpans 并导致几个问题。

所以我现在正在做的是创建一个新的 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;c<overlapSpans.length;c++) {
ssbCopy.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;c<spans.length;c++) {
TouchableSpan obj = spans[c];

ssbCopy.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);

关于java - 克隆 SpannableStringBuilder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24814758/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com