如何在允许表情符号输入的情况下限制编辑文本中的最大字符数?

how to limit max characters in edittext with emoji inputs allowed?

我有一个要求,我需要限制在 EditText 中输入的字符数。我知道这可以通过我的 .xml 布局文件中的 EditText 属性 android:maxLength 轻松实现。

但我的问题是我的 EditText 还应该允许用户输入表情符号。现在要注意的是,一些表情符号的长度有时是 2 有时是 1。因此,android:maxLength=1 不允许输入长度 = 2 的表情符号.

我可以使用字符 class:

的这种方法得到字符串的正确长度(每个表情符号字符都算作 1)
Character.codePointCount(charSequence.toString(), 0, charSequence.toString().length())

我试过像这样使用 InputFilter:

InputFilter inputFilter = new InputFilter() {
            @Override
            public CharSequence filter(CharSequence charSequence, int i, int i1, Spanned spanned, int i2, int i3) {
                if (Character.codePointCount(charSequence.toString(), 0, charSequence.toString().length()) <= maxCharactersAllowed) {
                    return null;
                } else {
                    return "";
                }
            }
        };

但是返回的 charSequence 给了我奇怪的纯文本和表情符号文本结果,所以我用来比较长度的字符串给出了奇怪的结果。

有人可以帮我正确实施对 EditText 接受表情符号字符的最大字符数的限制吗?

谢谢,Joe。在您的帮助下,我找到了这样的解决方案:

editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                oldTextString = charSequence.toString();
            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void afterTextChanged(Editable editable) {
                String newTextString = editable.toString();
                if (!oldTextString.equals(newTextString)) {
                    if (Character.codePointCount(newTextString, 0, newTextString.length()) > maxCharactersAllowed) {
                        newTextString = oldTextString;
                    }
                    editText.setText(newTextString);
                    editText.setSelection(newTextString.length());
                }
            }
        });