我得到了一个EditText,它具有下面的多个彩色文本。有什么方法可以存储文本和颜色并再次显示它们?我曾经使用sharedPreference来存储字符串整数等。但这不适用于跨度。
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);
根据@commonsware答案:
- 您需要将跨度文本转换为html字符串:
String html = Html.toHtml(yourEditText.getText());
将跨文本转换为字符串后,您可以将其存储在数据库或共享首选项或其他任何内容中。
要恢复存储的字符串,您必须还原并将其设置为iDittext:
String storedString = //The string you saved it before
yourEditText.setText(Html.fromHtml(storedString));
您现在有一个跨越的字符串!