Stack trace: java.lang.IndexOutOfBoundsException: setSpan (0 ... -1) has end before start at android.text.SpannableStringInternal.checkRange(SpannableStringInternal.java:485) at android.text.SpannableStringInternal.setSpan(SpannableStringInternal.java:199) at android.text.SpannableStringInternal.copySpansFromSpanned(SpannableStringInternal.java:87) at android.text.SpannableStringInternal.<init>(SpannableStringInternal.java:48) at android.text.SpannedString.<init>(SpannedString.java:35) at android.text.SpannedString.<init>(SpannedString.java:44) at android.text.TextUtils.stringOrSpannedString(TextUtils.java:532) at android.widget.TextView.setText(TextView.java:6318) at android.widget.TextView.setText(TextView.java:6227) at android.widget.TextView.setText(TextView.java:6179)探索
val spannableStringBuilder = SpannableStringBuilder("测试文本") val spannableString = SpannableString.valueOf(spannableStringBuilder)虽然恢复数据时不会报错,但 SpannableString 的属性全部消失了。
// 堆代码 duidaima.com val spannableStringBuilder = SpannableStringBuilder("测试文本") val htmlString = Html.toHtml(spannableStringBuilder) val spannableStringBuilder = Html.fromHtml(htmlString)
测试了一个,以上方式确实是一个顺利解决的崩溃问题。需要注意的是,Html 的两个方法都是耗时方法,最好异步调用。
class SpannableStringBuilderTypeAdapter : JsonSerializer<SpannableStringBuilder>, JsonDeserializer<SpannableStringBuilder> { override fun serialize( src: SpannableStringBuilder?, typeOfSrc: Type?, context: JsonSerializationContext? ): JsonElement { return src?.let { JsonPrimitive(Html.toHtml(src)) } ?: JsonPrimitive("") } override fun deserialize( json: JsonElement?, typeOfT: Type?, context: JsonDeserializationContext? ): SpannableStringBuilder { return json?.let { val fromHtml = Html.fromHtml(json.asString).trim() SpannableStringBuilder(fromHtml) } ?: SpannableStringBuilder("") } } //使用 Gson gson = new GsonBuilder() .setDateFormat("yyyy-MM-dd hh:mm:ss") .registerTypeAdapter(SpannableStringBuilder.class, new SpannableStringBuilderTypeAdapter()) .create();以上代码可以很好的工作,如果细心的话,可以注意到反序列化时用到 trim(),因为反序列化为 SpannableStringBuilder 后字符串末尾会多处两个换行符,这个 Stackoverflow 有提到HTML.fromHtml adds space at end of text?。