不支持表情包的自定义控件NoEmojiEditText
来源:互联网 发布:三合一建站系统源码 编辑:程序博客网 时间:2024/04/27 19:30
public class NoEmojiEditText extends EditText {
private String inputAfterText; // text before input emoji
private boolean resetText; // if reset text
private Context mContext;
public NoEmojiEditText(Context context) {
super(context);
this.mContext = context;
initEditText();
}
public NoEmojiEditText(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext = context;
initEditText();
}
public NoEmojiEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.mContext = context;
initEditText();
}
public static boolean containsEmoji(String source) {
int len = source.length();
for (int i = 0; i < len; i++) {
char codePoint = source.charAt(i);
if (!isEmojiCharacter(codePoint)) {
return true;
}
}
return false;
}
private static boolean isEmojiCharacter(char codePoint) {
return (codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA) ||
(codePoint == 0xD) || ((codePoint >= 0x20) && (codePoint <= 0xD7FF)) ||
((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) || ((codePoint >= 0x10000)
&& (codePoint <= 0x10FFFF));
}
private void initEditText() {
addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int before, int count) {
if (!resetText) {
// 这里用s.toString()而不直接用s是因为如果用s,
// 那么,inputAfterText和s在内存中指向的是同一个地址,s改变了,
// inputAfterText也就改变了,那么表情过滤就失败了
inputAfterText = s.toString();
}
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (!resetText) {
if (count >= 2) {//表情符号的字符长度最小为2
CharSequence input = s.subSequence(start, start + count);
if (containsEmoji(input.toString())) {
resetText = true;
ToastUtil.showLeToast(mContext, mContext.getString(R.string.unsupport_emoji));
//是表情符号就将文本还原为输入表情符号之前的内容
setText(inputAfterText);
CharSequence text = getText();
if (text instanceof Spannable) {
Spannable spanText = (Spannable) text;
Selection.setSelection(spanText, text.length());
}
}
}
} else {
resetText = false;
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});
}
}
0 0
- 不支持表情包的自定义控件NoEmojiEditText
- 【转载】discuz自定义表情包
- 关于友盟IM自定义表情包的使用
- android自定义控件---添加表情
- android的自定义表情
- 不支持输入Emoji表情的EditText
- 自定义控件--仿QQ表情面板
- 表情包EmojiDialog的使用
- 康纳的表情包
- 康纳的表情包
- 康纳的表情包
- 康纳的表情包
- iOS自定义的表情键盘
- iOS自定义的表情键盘
- 坑!!关于通知栏中支持自定义布局,不支持自定义控件的问题
- 总结项目中不支持emoji表情的问题的解决方法
- 带有自定义属性的自定义控件的library包
- mysql字符串不支持emoj表情的处理方法
- PID9 / 佳佳的魔法照片 ☆
- mybatis多mapper select join出现缓存不一致问题
- 白话篇:利用二叉树先序/中序/后序确定二叉树求法分析
- javascript学习总结一
- Android Studio断点调试和高级调试
- 不支持表情包的自定义控件NoEmojiEditText
- Android Handler机制
- seekbar的secondaryprogress和progress
- fragment内嵌webView,输入框获得焦点禁用系统输入法,弹出自定义输入法的处理
- 锁表
- 关于SAP税的配置
- vs2012程序“[19084] iisexpress.exe: 程序跟踪”已退出,返回值为 0 (0x0)。
- loadrunner11 运行场景报错 兼容性问题
- [G+smo]细分网格时控制点的排序