文本与 EditText 中的 ImageSpan 混淆

Posted

技术标签:

【中文标题】文本与 EditText 中的 ImageSpan 混淆【英文标题】:Text is messed up with ImageSpan in EditText 【发布时间】:2012-12-01 19:31:04 【问题描述】:

我正在构建一个简单的聊天应用程序,用户可以在其中发送文本和表情符号。我可以将文本和表情符号发送到另一部手机。我的问题是:

1.当我输入内容并添加表情时:

然后我无法在图像之前和之后键入任何文本。我可以写在“o”字母之前。系统“看到”了我输入的内容,因此即使我在笑脸后输入“Honey”,我也看不到它,但 EditText 会注册它并发送消息:

2.当我在 Edittext 中添加一个表情符号然后我删除它时,我无法输入任何内容,因为删除的表情符号出现了。它只出现一次,所以无论我输入多少字符,EditText 看起来就像我删除表情符号之前一样,但是发送的文本没有表情符号,就像在所有三种情况下一样。

3.当我在EditText中输入“something”然后在“some”之后插入一个表情:

然后我把光标放在表情符号后面删除,剩下的就是:

但是当我按下发送按钮时,会发送正确的消息:

这就是表情的按钮监听器内部的内容(当我单击表情将其添加到 EditText 时,此方法被激活)。

ib_happy.setOnClickListener(new View.OnClickListener() 

    @Override
    public void onClick(View v) 

        int cursorPosition = mOutEditText.getSelectionStart();
            mOutEditText.getText().insert(cursorPosition, smileys[0]);
        SpannableStringBuilder ssb = new SpannableStringBuilder(mOutEditText.getText());
        ssb.setSpan(new ImageSpan(bitmapArray.get(0), ImageSpan.ALIGN_BASELINE), cursorPosition,  cursorPosition+2, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
        mOutEditText.setText(ssb, BufferType.SPANNABLE);
            mOutEditText.setSelection(cursorPosition+2);
        dialog_emoticon.dismiss();
    
);

【问题讨论】:

你能在哪里修复它? 是的,正如您在接受的答案中看到的那样 【参考方案1】:

我找到了解决方案。我所要做的就是将Spannable.SPAN_INCLUSIVE_INCLUSIVE 更改为Spannable.SPAN_EXCLUSIVE_EXCLUSIVE

【讨论】:

我有同样的问题,但Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 没有解决我的果冻豆设备上的问题。在 android 2.2 上,它按预期工作。你有这方面的信息吗? 很遗憾我没有,也没有 Jelly Bean 设备 @fish 我在Jelly Bean(模拟器)中测试过,没有问题。【参考方案2】:

我会在该edittext中添加一个textwatcher并在用户输入时观看,这样我就可以重新定位图像/设置文本/进行更正/验证输入/等等。

editText.addTextChangedListener(textWatcher);

textWatcher = new TextWatcher() 
    public void afterTextChanged(Editable s) 
        //editText.doStuffHere
        //reposition your image/etc.
    
    public void beforeTextChanged(CharSequence s, int start, int count, int after)  
    public void onTextChanged(CharSequence s, int start, int before, int count)  
;

【讨论】:

所以当我输入 hello:) /:) 是笑脸/ txt 计数为 7。然后我输入“Honey”,它是不可见的,但它在那里是因为输入的字符数增加到12. 我该怎么办? 对不起,我在这个上处于面包屑模式。也许在 afterTextChanged .... if (s.contains(":)")) 下,然后在 onTextChanged 下使用 start、before 和 count 通过确定“:)”的位置并使用来重建文本输出editText.getText & editText.setText.

以上是关于文本与 EditText 中的 ImageSpan 混淆的主要内容,如果未能解决你的问题,请参考以下文章

减少 ImageSpan 的高度和宽度

将 ImageSpan 对齐到 TextView 的顶部

AndroidRichText 让Textview轻松的支持富文本(图像ImageSpan点击效果等等类似QQ微信聊天)

为啥将 ImageSpan 添加到 Snackbar 的操作文本在 Android 设备 SDK 级别 26 上有效,但在 SDK 级别 25 上无效?

Android ImageSpan与TextView中的text居中对齐问题解决(无论TextView设置行距与否)

加载数据后 Recyclerview 项目高度更改