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));
}

}

转载于:https://www.cnblogs.com/ldq2016/p/8665624.html

android非法字符的判定、表情符号的判定相关推荐

  1. android 非法字符 \ufeff错误

    android studio导入项目老是会报错,我自己也是遇到一个就去网上搜索资料解决一个.昨天,自己导入海康的sdk Demo看看效果时,发现android studio报  非法字符 \ufe ...

  2. android非法字符 ufeff,Java-在Android Studi上编译时出现错误(1,1)非法字符'\ ufeff'...

    Java-在Android Studi上编译时出现错误(1,1)非法字符'\ ufeff' 我得到了一个Eclipse项目源代码(有人告诉我在Android Studio上,也许他们只是感到困惑),然 ...

  3. android非法字符 ufeff,Android 非法字符:'/ufeff'

    [问题来源] 不知道大家有没有做过这样的事,在Android开发的过程中,通过文本直接修改代码,不打开编译器,然后提交让同时编译运行.这时Android编译就会报错,指定修改的文件开始位置,显示非法字 ...

  4. 解决Android studio 非法字符的问题

    解决Android studio 非法字符的问题 参考文章: (1)解决Android studio 非法字符的问题 (2)https://www.cnblogs.com/zhaoyanjun/p/4 ...

  5. Android Studio 错误: 非法字符: #39;\ufeff#39; 解决方式|错误: 须要class, interface或enum...

    在导入eclipse项目到Android Studio出现这种错误, 非法字符: '\ufeff' 解决方式|错误: 须要class, interface或enum.查阅后了解到Eclipse能够智能 ...

  6. Android --- Android Studio 错误: 非法字符: ‘\ufeff’

    原因: Eclipse可以智能的把UTF-8+BOM文件转为普通的UTF-8文件,Android Studio还没有这个功能,所以使用Android Studio编译UTF-8+BOM编码的文件时会出 ...

  7. 非法字符: '\ufeff' 解决方案(Android Studio)

    为了顺应天下大势,决定将公司项目从Eclipse导入到Android Studio中,导入之后编译时出现非法字符: '\ufeff' 错误,造成无法编译. 问题所在:隐蔽字符BOM的问题 解决方案: ...

  8. 编译Android项目的时候提示非法字符:“\ufeff”的解决方法

    当编译一个新导入进Android studio的项目编译后提示非法字符:"\ufeff"的错误提示时,只需要将将字符改为GBK,然后再转化为UTF-8即可解决. 问题原因: 刚导入 ...

  9. long在C语言中是非法字符吗,C程序设计实践——实验指导

    一.课程的总体目标和具体要求 总体目标: 利用C语言和程序设计方法编制程序,借助计算机解决问题的基本能力.(支撑毕业能力要求1)独立解决文本处理.数学上的一些问题,编写较规范化的代码.(支撑毕业能力要 ...

  10. java 非法字符u3000_IDEA编码格式问题:Error:(3, 13) java: 非法字符: '\u0000'

    IDEA编码格式问题:Error:(3, 13) java: 非法字符: '\u0000' 打开IDEA,照常编译文件,突然就报错了 Error:(1, 3) java: 非法字符: '#' Erro ...

最新文章

  1. 零售行业SAP项目 --- SAP顾问向大数据转型的契机
  2. IP核引发的关于定,浮点数的认识
  3. jquery实现点击改变背景色,点击其他恢复原来背景色,被点击的改变背景色
  4. 12c闪回 oracle_Oracle12.1闪回功能
  5. EVGA Precision—— 显卡超频神器 可用于调节风扇转速 降温
  6. 论文浅尝 | 基于事理图谱的脚本事件预测
  7. 运维工程师必备之负载均衡集群及LVS详解
  8. 如何安装python环境_python入门第一步:如何安装Python和搭建Python环境?
  9. 并行算法设计与性能优化总结
  10. Win10使用tensorflow出现ImportError: DLL load failed: 动态链接库(DLL)初始化例程失败
  11. 使用 Kubeadm 安装部署 Kubernetes 1.12.1 集群
  12. 三星s4系统更新无法连接到服务器,三星s4无法更新系统?
  13. matlab 输出一行字,MATLAB输出结果的格式设置
  14. Linux0.11系列开篇
  15. go语言调用c 的头文件 so,golang 学习(10): 使用go语言调用c语言的so动态库-Go语言中文社区...
  16. Unity 游戏实例开发集合 之 JumpJump (简单跳一跳) 休闲小游戏快速实现
  17. 见贤思齐与三人行必有我师
  18. Snapchat三类广告形式及收益提升技巧详解
  19. vob文件如何转换成mp4
  20. 数据结构与算法-二叉搜索树

热门文章

  1. js之面向对象编程,封装 继承 多态(详细篇)
  2. JFreeChart 简单使用
  3. ubuntu20.4安装 mariadb 最新版
  4. CSS Margin 边距详解、CSS 实现水平垂直居中、overflow 兼容 Safari 浏览器
  5. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_8_字节输入流_InputStream类FileInputStream...
  6. Java历史,Java跨平台
  7. 信息管理与信息系统专业渊源
  8. js和jQuery的总结
  9. error : cannot open source file SDKDDKVer.h
  10. centos7 下安装生物信息软件的问题小总结