感谢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;
}
}