android 表情删除,Android Spannable - 表情符号删除UTF 16

感谢Gabe Sechan的帮助。

以下是一些适用于我的代码。随意添加改进。

在自定义的EditText固定的选择:

LinkedList mEmojis = new LinkedList<>();

boolean fromReselecting = false;

@Override

protected void onSelectionChanged(int selStart, int selEnd) {

//Log.d("Selection changed", selStart + " " + selEnd + " length: " + getText().length());

if(!fromReselecting && selStart != selEnd){

EmojiData.EmojiTupel toFix = inBetweenEmoji(selStart, selEnd);

if(toFix != null){

fromReselecting = true;

setSelection(toFix.start, toFix.end);

}

}

else{

fromReselecting = false;

}

}

private EmojiData.EmojiTupel inBetweenEmoji(int selStart, int selEnd){

if(mEmojis == null){

return null;

}

for (EmojiData.EmojiTupel tupel: mEmojis) {

if((tupel.start < selStart && selEnd <= tupel.end) ||

(tupel.start <= selStart && selEnd < tupel.end)

){

//Log.d("InBetween ", "Selection: " + selStart + " " + selEnd + " Emoji: " + tupel.start + " "+ tupel.end);

return tupel;

}

}

return null;

}

@Override

protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {

mEmojis = EmojiUtils.insertEmojis(getContext(), getText(), mEmojiconSize);

}

而且在那里使用的KeyEvents文本时,应删除自定义InputConnection。适用于多种表情符号,因为选择是固定的。

@Override

public InputConnection onCreateInputConnection(EditorInfo outAttrs) {

return new EmojiInputConnection(super.onCreateInputConnection(outAttrs),

true);

}

private class EmojiInputConnection extends InputConnectionWrapper {

public EmojiInputConnection(InputConnection target, boolean mutable) {

super(target, mutable);

}

@Override

public boolean deleteSurroundingText(int beforeLength, int afterLength) {

if (beforeLength == 1 && afterLength == 0) {

return sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL))

&& sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL));

} else{

int cursorPos = getSelectionStart();

int cursorEnd = getSelectionEnd();

if(cursorEnd == cursorPos && beforeLength == 2 && afterLength == 0){

return sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL))

&& sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL));

}

}

return super.deleteSurroundingText(beforeLength, afterLength);

}

}

其中EmojiTupel是来自另一个类的字符串中的索引的包装。

public static class EmojiTupel{

public int start, end;

public EmojiTupel(int start, int end){

this.start = start;

this.end = end;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值