如何禁用在Android EditText中输入的表情符号?

Qua*_*ddd 43 keyboard android emoji

textEditText和TextView 的inputType的大多数实现(除了URI,密码等)都允许表情符号 - 尽管在大多数Google键盘配置中,此按钮是隐藏的.有没有办法禁止在EditText中输入表情符号?是否有一个inputType参数可以与textMultiLine禁用表情符号配对?

wox*_*iao 24

修改build.gradle文件,将XEditText添加到项目中:

dependencies{
    compile 'com.xw.repo:xedittext:2.0.0@aar'
}
Run Code Online (Sandbox Code Playgroud)

之后,在layout.xml中:

<com.xw.repo.XEditText
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:x_disableEmoji="true"/>
Run Code Online (Sandbox Code Playgroud)

要么:

像这样自定义EditText:

public class CustomEditText extends EditText {
    public CustomEditText(Context context) {
        super(context);
        init();
    }

    public CustomEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public CustomEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        setFilters(new InputFilter[]{new EmojiExcludeFilter()});
    }

    private class EmojiExcludeFilter implements 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));
                if (type == Character.SURROGATE || type == Character.OTHER_SYMBOL) {
                    return "";
                }
            }
            return null;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

两者都会运作良好!

  • 答案应该是后者.你不能建议开发人员真正使用第三方库来解决这类问题.在android中,这样一个小问题需要修复外部库.这失控了.伤心! (5认同)

Pra*_* シ 20

从键盘禁用表情符号有一些棘手的方法..

你只需要设置

android:inputType="textEmailAddress"

EditText......

  <EditText
    android:id="@+id/edt_note"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="@string/note"
    android:inputType="textEmailAddress"
    android:padding="10dp"
    android:textColor="@color/white" />
Run Code Online (Sandbox Code Playgroud)

我不确定它是否适用于所有情况但在我的情况下它对我有用...

  • 这不会阻止用户复制粘贴表情符号。 (3认同)

Adr*_*tis 17

digitsEditText的xml文件中有值.你可以设置所有可接受的字符.

<EditText
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:digits="qwertyuiopasdfghjklzxcvbnm 1234567890 QWERTYUIOPASDFGHJKLZXCVBNM" />
Run Code Online (Sandbox Code Playgroud)

我知道,这不是最好的解决方案,但有效:)

  • 如果您构建纯英语应用程序,这是一个很好的解决方案。但我无法想象对我希望我的应用程序本地化的每种语言都这样做。 (4认同)

Sur*_*nav 9

添加此表情符号过滤器类:

public class EmojiFilter {
    public static InputFilter[] getFilter()
    {
         InputFilter EMOJI_FILTER = new InputFilter() {

            @Override
            public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
                for (int index = start; index < end; index++) {

                    int type = Character.getType(source.charAt(index));

                    if (type == Character.SURROGATE || type==Character.NON_SPACING_MARK
                            || type==Character.OTHER_SYMBOL) {
                        return "";
                    }
                }
                return null;
            }
        };
         return new InputFilter[]{EMOJI_FILTER};
    }
}
Run Code Online (Sandbox Code Playgroud)

要在编辑文本中禁用表情符号,请执行以下操作:

editText.setFilters(EmojiFilter.getFilter());
Run Code Online (Sandbox Code Playgroud)

有一些表情符号可以输入,所以我补充说:

type==Character.NON_SPACING_MARK || type==Character.OTHER_SYMBOL
Run Code Online (Sandbox Code Playgroud)

在 if 条件下。

  • 这是一个很好的解决方案,到目前为止似乎效果很好,谢谢!:) (2认同)

Muh*_*que 9

我为此目的制作了 Kotlin 扩展。它还可以防止复制粘贴表情符号。

扩大:

fun EditText.filterEmoji() {
    filters = arrayOf(InputFilter { source, _, _, _, _, _ ->
        source.filter { Character.getType(it) != Character.SURROGATE.toInt() && Character.getType(it) != Character.OTHER_SYMBOL.toInt() }
    })
}
Run Code Online (Sandbox Code Playgroud)

在 Kotlin 类中:

editText.filterEmoji()
Run Code Online (Sandbox Code Playgroud)

就是这样。享受!

  • 尽管如此,它还是允许使用一些符号。为了避免这些问题,请在过滤器中执行以下操作: `Character.getType(it) != Character.SURROGATE.toInt() &amp;&amp; Character.getType(it) != Character.OTHER_SYMBOL.toInt() ` (3认同)

pau*_*nku 7

@woxingxiao中的代码很有用,直到你在xml中指定任何inputType为止android:inputType="textMultiLine".

我改变了一点他的提议,我觉得它很有效.

public class EmojiExcludeEditText extends EditText {

    private EmojiExcludeFilter emojiExcludeFilter;

    public EmojiExcludeEditText(Context context) {
        super(context);
        init();
    }

    public EmojiExcludeEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public EmojiExcludeEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        if (emojiExcludeFilter == null) {
            emojiExcludeFilter = new EmojiExcludeFilter();
        }
        setFilters(new InputFilter[]{emojiExcludeFilter});
    }

    @Override
    public void setFilters(InputFilter[] filters) {
        if (filters.length != 0) { //if length == 0 it will here return when init() is called
            boolean add = true;
            for (InputFilter inputFilter : filters) {
                if (inputFilter == emojiExcludeFilter) {
                    add = false;
                    break;
                }
            }
            if (add) {
                filters = Arrays.copyOf(filters, filters.length + 1);
                filters[filters.length - 1] = emojiExcludeFilter;
            }
        }
        super.setFilters(filters);
    }

    private class EmojiExcludeFilter implements 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));
                if (type == Character.SURROGATE || type == Character.OTHER_SYMBOL) {
                    return "";
                }
            }
            return null;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


era*_*dac 6

您可以为黑名单/白名单字符编写输入过滤器

public static InputFilter getEditTextFilterEmoji()
{
    return new InputFilter()
    {
        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend)
        {
            CharSequence sourceOriginal = source;
            source = replaceEmoji(source);
            end = source.toString().length();

            if (end == 0) return ""; //Return empty string if the input character is already removed

            if (! sourceOriginal.toString().equals(source.toString()))
            {
                char[] v = new char[end - start];
                TextUtils.getChars(source, start, end, v, 0);

                String s = new String(v);

                if (source instanceof Spanned)
                {
                    SpannableString sp = new SpannableString(s);
                    TextUtils.copySpansFrom((Spanned) source, start, end, null, sp, 0);
                    return sp;
                }
                else
                {
                    return s;
                }
            }
            else
            {
                return null; // keep original
            }
        }

        private String replaceEmoji(CharSequence source)
        {

            String notAllowedCharactersRegex = "[^a-zA-Z0-9@#\\$%\\&\\-\\+\\(\\)\\*;:!\\?\\~`£\\{\\}\\[\\]=\\.,_/\\\\\\s'\\\"<>\\^\\|÷×]";
            return source.toString()
                    .replaceAll(notAllowedCharactersRegex, "");
        }

    };
}
Run Code Online (Sandbox Code Playgroud)

然后将其设置为EditText过滤器;

InputFilter[] filterArray = new InputFilter[] {getEditTextFilterEmoji()}
editText.setFilters(filterArray);
Run Code Online (Sandbox Code Playgroud)


Gab*_*han 5

没有什么可以 100% 禁用表情符号。键盘可以以它认为最好的任何方式在它看到的任何模式下运行,因此没有任何设置可以阻止表情符号。如果您必须阻止它,请使用 TextWatcher 将字符列入白名单或黑名单。


小智 -4

尝试android:inputtype="textUri|textMultiLine"

在此参数中,键盘会将语音输入按钮更改为“/”按钮。

  • 并非所有键盘都会这样做。有些键盘可以,但它远非通用功能。您不能依赖键盘对模式执行任何特定行为。 (3认同)