Android Spanable文本保存/存储问题

Android Spanable文本保存/存储问题,android,android-edittext,store,spannable,Android,Android Edittext,Store,Spannable,我有一个edittext,它有多种颜色的文本,如下面的代码。有没有办法存储文本和颜色并再次显示?我曾经使用SharedReference来存储字符串、整数等,但这对可扩展性不起作用 Spannable span1 = new SpannableString("this"); Spannable span2 = new SpannableString("is"); Spannable span3 = new SpannableString("text"); span1.setSpan(new Fo

我有一个edittext,它有多种颜色的文本,如下面的代码。有没有办法存储文本和颜色并再次显示?我曾经使用SharedReference来存储字符串、整数等,但这对可扩展性不起作用

Spannable span1 = new SpannableString("this");
Spannable span2 = new SpannableString("is");
Spannable span3 = new SpannableString("text");
span1.setSpan(new ForegroundColorSpan(Color.parseColor("#292929")), 0, span1.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
span2.setSpan(new ForegroundColorSpan(Color.parseColor("#2980b9")), 0, span2.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
span3.setSpan(new ForegroundColorSpan(Color.parseColor("#FFFFFF")), 0, span3.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

edittext.setText(TextUtils.concat(span1, span2, span3));

您可以使用
Html.toHtml()
获取
Spannable
的Html表示形式,然后使用
Html.fromHtml()
将其转换回。但是,您需要彻底测试这一点,因为并非所有格式都能在往返过程中保存下来。

SpannableString不可打包,因此您无法保存它们并正确地重新创建它们。您可以分别保存文本和跨距。跨距是可分割的,因此在重新创建跨距时,跨距会很好

Spannable span = new SpannableString("this is text");
span.setSpan(new ForegroundColorSpan(Color.parseColor("#292929")), 0, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
span2.setSpan(new ForegroundColorSpan(Color.parseColor("#2980b9")), 5, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
span3.setSpan(new ForegroundColorSpan(Color.parseColor("#FFFFFF")), 8, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

// Save these
String text = span.subString(0, span.length());
List<Span> spans = span.getSpans(0, span.length(), Object.class);
Spannable span=新的SpannableString(“这是文本”);
span.setSpan(新的ForegroundColorSpan(Color.parseColor(“#292929”)),0,4,span可启用。span_独占_独占);
span2.setSpan(新的ForegroundColorSpan(Color.parseColor(#2980b9”)),5,2,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
span3.setSpan(新的ForegroundColorSpan(Color.parseColor(#FFFFFF”)),8,4,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//保存这些
String text=span.subString(0,span.length());
List span=span.getspan(0,span.length(),Object.class);

根据@commonware答案:

  • 您需要将跨距文本转换为HTML字符串:
  • 将跨距文本转换为字符串后,可以将其存储在数据库、共享首选项或其他任何内容中

  • 要恢复存储的字符串,必须将其还原并设置为EditText:


  • 你现在有一根跨线了

    这很有趣--我想知道为什么跨距是
    可包裹的
    ,而
    跨距字符串
    不是?然而,问题是如何持久地存储东西,在这种情况下,
    Parcelable
    就没有那么有用了。嗨@commonware,我有一个可扩展字符串,其中包含来自资产的字体样式。使用html.fromHtml时,缺少字体样式。在sqlite中存储Spanable还有其他方法吗?@donmj:您可以试试看它是否涵盖了您的用例。我的猜测是,您需要提出自己的序列化机制。
    String html = Html.toHtml(yourEditText.getText());
    
    String storedString =  //The string you saved it before 
    yourEditText.setText(Html.fromHtml(storedString));