如何从EditText获取SpannableString 解决插入多图时原有图片消失问题
问题根因
你代码的核心问题是每次新建SpannableString时,调用了mainEditText.getText().toString()获取内容,toString()只会提取纯文本内容,之前已经添加的ImageSpan等富文本样式会全部丢失,所以每次插入新图时旧图都会消失。另外你的代码里先插入空格、再拼接额外空格的逻辑也存在冗余和位置偏移问题。
修正后可用代码
void addImageToEditText(){ // 获取光标位置,非法位置默认插入到末尾 int position = mainEditText.getSelectionStart(); if (position < 0) { position = mainEditText.getText().length(); } // 直接获取Editable,它本身是Spannable子类,保留所有已有Span样式 Editable editable = mainEditText.getText(); // 插入占位空格 editable.insert(position, " "); // 加载图片设置边界 Drawable d = ContextCompat.getDrawable(this, R.drawable.unknown); d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE); // 直接在原有Editable上设置Span,不需要重新setText editable.setSpan(span, position, position+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // 可选:将光标移动到插入的图片后方,方便后续输入 mainEditText.setSelection(position + 1); }
补充说明
- 不要随意将富文本内容转纯字符串处理,
EditText的getText()返回的Editable本身支持直接修改内容、添加/移除Span,不需要每次重新调用setText()覆盖内容 - 如果要插入多张不同的图片,只需要替换加载的
Drawable资源即可,原有图片不会消失
内容的提问来源于stack exchange,提问作者sailaminoak
相关产品推荐
相关产品推荐

