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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容