Android EditText Span 操作相关坑

一: EditText getText 触发onSpanChange

有这种业务需求:对 EditText 中的 imageSpan 进行替换成[图片],然后提交数据。

image.png

结果引用的是同一个Editable,导致原数据发生了变化,从而导致onSpanChange

二: Editable.Factory.getInstance().newEditable(editor.visualEditor.text) 解决新拷贝一个数据

为了防止串改原始数据,Android提供了这样的一个API。拷贝了一个 Editable

三: SpannableString 不可变问题

还是要先看完API,再写代码才对

接着上面的聊,那么就用 SpannableString去包一下呗:

 SpannableString(Editable.Factory.getInstance().newEditable(editor.visualEditor.text) )

结果打脸了的, SpannableString 其实是不可变的。。。所以操作无效。

解决方案 使用 SpannableStringBuilderSpannableStringBuilderSpannableString 区别就是前者是创建之后仍可进行编辑,而后者不可编辑,虽然他们都从属于 Spannable, 但是SpannableStringBuilder 才有 replace方法。able 真是蒙蔽了双眼。

四: SpannableStringBuilder getSpan 返回的span列表,部分设备顺序倒序问题

image.png

如果所示,实现问题一种的需求,一切看似正常,but,来了一个锤子手机和三星设备,发现最终提交给服务器的图片顺序总是错误的,其他设备并没有发现这个问题。百思不得其解。今天跟了一下,发现在锤子手机上 editable.getSpans 返回的数组是错误的。 但是庆幸的是,当拿每一个 spanSpannableStringBuilder 获取索引的时候,index 都是对的。

所以最终解决方案是,根据 SpannableStringBuilder 实际所在的 index ,进行排序,纠正顺序错乱问题。代码如下:

image.png

你可能感兴趣的:(Android EditText Span 操作相关坑)