一: EditText getText 触发onSpanChange
有这种业务需求:对 EditText
中的 imageSpan
进行替换成[图片]
,然后提交数据。
结果引用的是同一个
Editable
,导致原数据发生了变化,从而导致onSpanChange
二: Editable.Factory.getInstance().newEditable(editor.visualEditor.text) 解决新拷贝一个数据
为了防止串改原始数据,Android提供了这样的一个API。拷贝了一个 Editable
三: SpannableString 不可变问题
还是要先看完API,再写代码才对
接着上面的聊,那么就用 SpannableString
去包一下呗:
SpannableString(Editable.Factory.getInstance().newEditable(editor.visualEditor.text) )
结果打脸了的, SpannableString
其实是不可变的。。。所以操作无效。
解决方案 使用 SpannableStringBuilder
, SpannableStringBuilder
和 SpannableString
区别就是前者是创建之后仍可进行编辑,而后者不可编辑,虽然他们都从属于 Spannable
, 但是SpannableStringBuilder
才有 replace
方法。able
真是蒙蔽了双眼。
四: SpannableStringBuilder getSpan 返回的span列表,部分设备顺序倒序问题
如果所示,实现问题一种的需求,一切看似正常,but,来了一个锤子手机和三星设备,发现最终提交给服务器的图片顺序总是错误的,其他设备并没有发现这个问题。百思不得其解。今天跟了一下,发现在锤子手机上 editable.getSpans
返回的数组是错误的。 但是庆幸的是,当拿每一个 span
去 SpannableStringBuilder
获取索引的时候,index
都是对的。
所以最终解决方案是,根据 SpannableStringBuilder
实际所在的 index
,进行排序,纠正顺序错乱问题。代码如下: