【android非法字符的判定表情符号的判定】春衣少年当酒歌,起舞四顾以笑和。这篇文章主要讲述android非法字符的判定表情符号的判定相关的知识,希望能为你提供帮助。
public class EmojiEditText extends EditText {
// 输入表情前的光标位置
private int cursorPos;
// 输入表情前EditText中的文本
private String inputAfterText;
// 是否重置了EditText的内容
private boolean resetText;
private Context mContext;
public EmojiEditText(Context context) {
super(context);
this.mContext = context;
initEditText();
}
public EmojiEditText(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext = context;
initEditText();
}
public EmojiEditText(Context context, AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.mContext = context;
initEditText();
} // 初始化edittext 控件
private void initEditText() {
addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start,
int before, int count) {
if (!resetText) {
cursorPos = getSelectionEnd();
// 这里用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(cursorPos, cursorPos
+ count);
if (containsEmoji(input.toString())) {
resetText = true;
//暂不支持输入Emoji表情符号
Toast.makeText(mContext, "暂不支持输入表情符号",
Toast.LENGTH_SHORT).show();
// 是表情符号就将文本还原为输入表情符号之前的内容
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) {
}
});
}
/**
* 检测是否有emoji表情
*
* @param source
* @return
*/
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)) { // 如果不能匹配,则该字符是Emoji表情
return true;
}
}
return false;
}
/**
* 判断是否是Emoji
*
* @param codePoint
*
比较的单个字符
* @return
*/
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));
}
}
推荐阅读
- 7.应用程序和App特性
- Spring MVC的handlermapping之BeanNameUrlHandlerMapping初始化
- Android播放音频MediaPlayer的几种方式介绍
- MyBatis官方教程及源代码解析——mapper映射文件
- mybatis的面试一对一,一对多,多对多的mapper.xml配置
- No mapping found for HTTP request with URI [/Portal/download] in DispatcherServlet with name 'sp
- Neo4j CQL函数和数据类型
- Neo4j delete子句
- unity2017.4.0f1使用AS3.0的AndroidSDK遇到的问题