Android Spanable 文本保存/存储问题

Posted

技术标签:

【中文标题】Android Spanable 文本保存/存储问题【英文标题】:Android Spannable text save/store issue 【发布时间】:2014-02-22 01:20:46 【问题描述】:

我有一个edittext,它有多个彩色文本,如下面的代码。有没有办法存储文本和颜色并再次显示它们?我曾经使用 SharedPreference 来存储字符串整数等,但这不适用于 Spannables。

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

【问题讨论】:

【参考方案1】:

根据@CommonsWare 的回答:

    您需要将跨区文本转换为 html 字符串:
String html = Html.toHtml(yourEditText.getText());

    将跨区文本转换为字符串后,您可以将其存储在数据库或共享首选项或其他任何地方。

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

String storedString =  //The string you saved it before 
yourEditText.setText(Html.fromHtml(storedString));

你现在有一个跨接字符串!

【讨论】:

【参考方案2】:

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

【讨论】:

这很有趣——我想知道为什么跨度是ParcelableSpannedString 不是?但是,问题在于持久存储内容,在这种情况下,Parcelable 没有那么有用。【参考方案3】:

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

【讨论】:

嗨@CommonsWare,我有包含资产字体样式的 Spannable String。使用 html.fromHtml 时缺少字体样式。还有其他方法可以在 sqlite 中存储 Spannable 吗?。 @donmj:你可以试试my XHTML round-trip code,看看它是否涵盖了你的用例。我的猜测是你需要想出自己的序列化机制。

以上是关于Android Spanable 文本保存/存储问题的主要内容,如果未能解决你的问题,请参考以下文章

android中想要对文本框中输入的数据进行保存怎么实现

android中想要对文本框中输入的数据进行保存怎么实现

将文本文件保存到 Android 中的公共内部存储器位置

Android界面中一个文本框,返回时保存数据,

从 EditText 获取 Spanable String

在android中保存edittext数据[重复]