如何在Android的EditText中检测表情符号

8
我希望能检测我的EditText中是否包含表情符号(emoticons),但我不知道如何检测它们。

通过类比,我指的是表情符号。 - Vivek Chahar
你试过在 EditText 中输入表情符号并使用 EditText.getText() 获取文本内容吗? - Ivo
3个回答

22

我使用以下过滤器来在键盘上输入时禁用表情符号:

InputFilter filter = new InputFilter() {
    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        for (int i = start; i < end; i++) {
            int type = Character.getType(source.charAt(i));
            //System.out.println("Type : " + type);
            if (type == Character.SURROGATE || type == Character.OTHER_SYMBOL) {
                return "";
            }
        }
        return null;
    }
};

mMessageEditText.setFilters(new InputFilter[]{filter});

如果您只需要检测EditText中是否包含任何表情符号字符,您可以在android.text.TextWatcher接口的实现中使用此原则(Character.getType()) (在onTextChange()afterTextChanged()方法中),或者例如使用mMessageEditText.getText()(返回CharSequence类)上的简单for循环和charAt()方法。


2
这真的非常有帮助。 - bhavesh kaila
但是如果使用过滤器,将会存在另一个错误。首先输入一些文字,然后输入表情符号,再按退格键,将会删除2个字符而不是1个。 - HendraWD
1
不错,但遗憾的是,这也排除了很多其他特殊字符,如©®™℅,中文符号甚至触觉字母。 - 0101100101
您可能还想将更多的字符类型添加到此方法中,例如Character.ENCLOSING_MARK,Character.MATH_SYMBOL,Character.OTHER_PUNCTUATION,Character.DASH_PUNCTUATION,Character.MIN_RADIX。 - Kirill Kostrov

1
如果你提到的“simile”是指修辞手法,你可以使用“.getText()”和“String”方法“.contains(String)”来检查它是否包含字符串“like”或“as”。
代码片段:
EditText myEditText = (EditText)findViewById(R.id.myEditText);
String input = myEditText.getText();
if(input.contains("like") || input.contains("as"))
{
    //code
}

通过类比我指的是表情符号。 - Vivek Chahar
1
我想你指的是表情符号。比喻是完全不同的东西。 - Kuffs
非常抱歉,但现在我已经更正了这个问题。 - Vivek Chahar

-2

这取决于您在edittext中实现表情符号的方式。如果您正在使用动画,可以使用一个技巧来实现。您可以设置一个条件,每当添加一个表情符号时,您可以向arrayList添加某种关键字,每当删除表情符号时,您可以从arrayList中删除该关键字。最后,您可以通过处理arrayList项来检查该列表是否已添加该表情符号。

例如...

if(Smiley_added){
arraylist.add(smiley_code,i);
}

if(simley_removed){
arraylist.remove(smileycode,i);
}

if(arraylist.get(i).equals("smileyCode")){
do this....
}

我想要检测文本中是否存在表情符号,然后在发送到服务器之前将它们删除,那么这个表情符号的映射图可以有多大?如果我通过构建表情符号与代码的映射来检查每个表情符号,这种方法将是硬编码的。 - Vivek Chahar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接