如何在Android中以编程方式禁用表情符号

如何在Android中以编程方式禁用表情符号,android,android-softkeyboard,emoji,android-viewtreeobserver,Android,Android Softkeyboard,Emoji,Android Viewtreeobserver,我想通过编程的方式从键盘上隐藏表情符号和自动建议。它在一些安卓设备上工作,但并非在所有设备上都工作。以下是我的隐藏自动建议代码: txtSingupemail.setInputType(InputType.TYPE_TEXT_VARIATION_FILTER | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS |InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); txt

我想通过编程的方式从键盘上隐藏表情符号和自动建议。它在一些安卓设备上工作,但并非在所有设备上都工作。以下是我的隐藏自动建议代码:

txtSingupemail.setInputType(InputType.TYPE_TEXT_VARIATION_FILTER | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS 
                           |InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
txtSignuppwd.setInputType(InputType.TYPE_TEXT_VARIATION_FILTER | InputType.TYPE_TEXT_VARIATION_PASSWORD);
txtSignuppwd.setTransformationMethod(PasswordTransformationMethod.getInstance());
这是我的UI的快照:

这是用户单击“登录”按钮时的布局。当用户点击左下角标记为红色的图标时,键盘高度会因提示的表情而增加

请参见下面的快照:


有什么方法可以通过编程方式从键盘上隐藏这些顶级表情吗?

Android上有成百上千的输入法编辑器(又称软键盘)

没有人必须提供表情符号。欢迎那些愿意的人随时提供他们想要的任何东西

输入法编辑器不需要遵守您在
EditText
上设置的任何标志。因此,输入法编辑器不需要提供任何阻止表情输入的方法。而且,即使有些人确实提供了这种能力,其他人可能没有,而那些提供这种能力的人可能会通过不同的标志来实现

键盘上是否有表情符号选项的决定权在键盘开发者和用户(选择使用键盘的用户)之间。你没有投票权


由于AFAIK表情符号只是Unicode字符,而且您应该在其他地方支持Unicode字符(例如,中文字形),因此不清楚您必须避免使用表情符号的技术原因。也就是说,如果您反对表情符号,欢迎您尝试将其从输入的文本中过滤出来(例如,使用
TextWatcher

这可能对您有所帮助,它将禁用表情符号android:inputType=“textShortMessage”。如果对您没有帮助,请告诉我

试试这个 没有任何东西会100%禁用表情符号。您只能隐藏键盘的默认表情符号。如果有人使用自定义键盘,则无法隐藏自定义键盘的表情符号 也许这对你有帮助

editext.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);

试试这个它对我有用

editText.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;
        }
    }
editText.setFilters(新的InputFilter[]{new EmojiExcludeFilter()});
私有类EmojiExcludeFilter实现InputFilter{
@凌驾
公共CharSequence筛选器(CharSequence源、int开始、int结束、跨区目标、int开始、int结束){
for(int i=start;i
这可能不是最好的解决方案,但下面的代码对我来说效果很好:

editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
由于密码输入类型会更改字体,您只需将默认字体设置为:

editText.setTypeface(Typeface.DEFAULT);

在Kotlin中,将输入筛选器添加到Edittext。当数字和字母被快速输入时,我遇到了一些问题。这个代码解决了这个问题

editText.filters = editTextAllowAlphabetsSymbols("") // Add any symbols that you wish to allow
那么这个

fun editTextAllowAlphabetsSymbols(symbols:String):Array<InputFilter>{
        return arrayOf(AlphabetsSymbolsInputFilter(symbols))
}

适用于Android


mEditText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD| TEXT_MULTILINE); 
键入\文本\变体\可见\密码-我们使用密码字符作为EditTest的文本输入。它没有emojis和email键,比如.com和@keys TEXT\u MULTILINE-这会将键盘布局按钮[Done]或[->]更改为[Enter]键,因此我们可以使用多行文本或新行功能

以Xamarin形式

在OnElementChanged方法中创建CustomRender和


protected override void OnElementChanged(ElementChangedEventArgs e)
        {
            base.OnElementChanged(e);

                if (Control != null)
                {
                    Control.ImeOptions = Android.Views.InputMethods.ImeAction.Done;
                    Control.InputType = Android.Text.InputTypes.ClassText | Android.Text.InputTypes.TextVariationVisiblePassword| Android.Text.InputTypes.TextFlagMultiLine;
                    Control.SetTypeface(Typeface.Default, TypefaceStyle.Normal);
                }
            }

这是最好的答案,一个简单的TextWatcher对我来说非常有用,它就是EmojieExcludeFilter,可以在使用TextWatcher过滤输入的每个表情时找到。这是当前最好的解决方案。答案很好,但是,在我看来,即使使用Unicode,至少也有一个技术原因(我已经面对过好几次):上传用户数据到utf8格式的MySQL数据库,因为它不接受emojis,如前所述。有时候,我们对数据库没有任何控制权,所以阻止emojis是唯一的办法。@thelawnmowerman:那么这就是应用程序级别的数据验证问题。就我个人而言,我还没有尝试过,但这是我的主要方向。

protected override void OnElementChanged(ElementChangedEventArgs e)
        {
            base.OnElementChanged(e);

                if (Control != null)
                {
                    Control.ImeOptions = Android.Views.InputMethods.ImeAction.Done;
                    Control.InputType = Android.Text.InputTypes.ClassText | Android.Text.InputTypes.TextVariationVisiblePassword| Android.Text.InputTypes.TextFlagMultiLine;
                    Control.SetTypeface(Typeface.Default, TypefaceStyle.Normal);
                }
            }