有的公司后台提交数据没有支持android的表情符号,导致提交一些表单数据中带有系统的表情时,接口会返回500错误。
针对这种情况,可在每次输入完一个值后监听最后一位是不是表情,如果是表情,就删除掉。
这里的表情判断我们可以通过在输入框中输入所有需要过滤掉的表情,然后打印这些个表情的字符串值,将其加入到工具类中的codePoints集合。中。
输入框限制中文字母及数字需要在onTextChanged方法中调用。如下
剔除掉表情符号在afterTextChanged方法中调用,如下
需求可以灵活变动,要什么加什么,输入限制修改正则或表情集合即可
editTextView.addTextChangedListener(new TextWatcher() {
String str;
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
String strs = editTextView.getText().toString();
//正则限制只输入数字字母汉字
str = MethodsUtils.stringFilter2(strs, "[^A-Z0-9a-z\u4E00-\u9FA5]");
if (!strs.equals(str)) {
editTextView.setText(str);
editTextView.setSelection(str.length());
}
}
@Override
public void afterTextChanged(Editable editable) {
//剔除掉软键盘输入的一些自带的表情(若后台提交表情数据报错时)
int index = editTextView.getSelectionStart();//获取光标位置
if (MethodsUtils.havaEmoji(editable.toString())) {
//包含表情就删掉这个表情
editable.delete(index - 1, index);//删除光标前的字符
return;
}
}
});
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
/**
* desc: 公共类
* author: yt
*
* creat: 2018/12/6 10:50
*/
public class MethodsUtils {
public static String stringFilter2(String str, String pach) throws PatternSyntaxException {
//只允许数字和汉字和字母
String regEx = pach;
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str);
return m.replaceAll("").trim();
}
/**
* 将系统表情转化为字符串
*
* @param s
* @return
*/
public static String getString(String s) {
int length = s.length();
String context = "";
//循环遍历字符串,将字符串拆分为一个一个字符
for (int i = 0; i < length; i++) {
char codePoint = s.charAt(i);
//判断字符是否是emoji表情的字符
if (isEmojiCharacter(codePoint)) {
//如果是将以大括号括起来
String emoji = "{" + Integer.toHexString(codePoint) + "}";
context = context + emoji;
continue;
}
context = context + codePoint;
}
return context;
}
/**
* 将系统表情转化为字符串
*
* @param s
* @return
*/
public static boolean havaEmoji(String s) {
int length = s.length();
String context = "";
//循环遍历字符串,将字符串拆分为一个一个字符
for (int i = 0; i < length; i++) {
char codePoint = s.charAt(i);
//判断字符是否是emoji表情的字符
if (isEmojiCharacter(codePoint)) {
//如果是就返回
return true;
}
}
return false;
}
private static char[] codePoints = {'☔', '☕', '✈', '⛪', '⛲', '✂', '⛵', '⛽', '⛺', '⚽',
'⚾', '⛳', '⛄', '⛽', '⚓', '⌚', '✒', '✏', '✍', '☁', '⚡', '⏰', '☎', '⏳', '⌛', '⛎', '♈', '♉', '♊', '♋', '♌', '♍', '♎',
'♏', '♐', '♑', '♒', '♓', '✴', '㊙', '㊗',
'▶', '⏩', '⏪', '◀', '➡', '⬆', '⬇', '↗', '↘', '↙', '↖', '⬅', '©', '®', '™', '⬛', '⬜', '♠', '♣', '♥', 'Ⓜ', '⛔', '‼', '⁉', '〽', '♻', '❇', '⃣',
'Ⓜ', '⛔', '⁉', '‼', '〽', '❎', '✅', '⏫', '⏬', '↕', '↔', '↪', '↩', '⤵', 'ℹ', '✔', '〰', '➖', '➗', '✖', '➰', '⚪', '☑', '⚫', '▫', '◾', '◻',
'◽', '✉', '☀', '⛅', '❄', '✨', '⭐', '�',
'✊', '☝', '✋', '✌', '✋', '☝', '❌', '⭕', '♨', '❗', '❕', '❓', '❔', '⚠', '✳', '➿', '♿', '♦'};
/**
* 是否包含表情
*
* @param codePoint
* @return 如果不包含 返回false,包含 则返回true
*/
public static boolean isEmojiCharacter(char codePoint) {
if (!((codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA)
|| (codePoint == 0xD) || ((codePoint >= 0x20) && (codePoint <= 0xD7FF))
|| ((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) || ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF)))) {
return true;
}
for (char c : codePoints) {
if (c == codePoint) {
return true;
}
}
return false;
}
}