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

12

我想编程隐藏键盘中的表情符号和自动建议,它在某些Android设备上有效,但不是所有设备都有效。这是我隐藏自动建议的代码:

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());

这是我的用户界面快照:

在此输入图片描述

当用户点击“signIn”按钮时,会出现这个布局。 当用户点击左下方标记为红色的图标时,键盘高度会因表情符号建议而增加。

请看下面的快照:

在此输入图片描述

是否有办法以编程方式隐藏键盘中的那些表情符号?

9个回答

27

尝试一下,它对我有用

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;
        }
    }

6

对于 Android 系统而言,有上百甚至上千种输入法编辑器(又称为软键盘)。

但并非每个输入法都支持 emoji 表情。如果有的话,开发者可以自由选择是否提供。

在 EditText 中设置标志后,并无硬性要求输入法必须遵守。因此,并无要求输入法提供任何阻止输入 emoji 的方式。即使有些输入法确实提供了这样的功能,其他输入法可能没有提供,或者使用不同的标志。

键盘是否提供 emoji 选项应该由开发人员和用户(选择使用哪种键盘)共同决定。您本人不能进行投票。

根据我所知,emoji 只是 Unicode 字符,因此它们与您在其他地方支持的 Unicode 字符(例如中文字符)相同。因此,不清楚您避免使用 emoji 的技术原因。但是,如果您反对使用 emoji,则可以尝试过滤输入的文本(例如使用 TextWatcher)。


1
这是最佳答案,一个对我非常好用的简单TextWatcher是在https://dev59.com/NGAg5IYBdhLWcg3w9e0y找到的EmojiExcludeFilter,可以禁用在Android EditText中输入表情符号。 - CSmith
使用TextWatcher过滤掉每个输入的表情符号是目前最佳解决方案。 - Hitchhiker
1
很好的回答,但是在我的看法中,即使使用Unicode也至少存在一个技术原因(我已经遇到过几次):将用户数据上传到MySQL数据库中的utf8,因为它不接受表情符号,如此处所述。有时候,我们对数据库没有任何控制,因此阻止表情符号是唯一的方法。 - thelawnmowerman
@thelawnmowerman:那就是在应用程序级别进行数据验证的问题。就我个人而言,我没有尝试过使用InputFilter的答案,但这是一个可以探索的方向。 - CommonsWare

4

这可能不是最好的解决方案,但以下代码对我来说运行良好:

editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

由于密码输入类型会更改字体,因此您只需将默认字体设置为它:

editText.setTypeface(Typeface.DEFAULT);

1
对于Android。

mEditText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD| TEXT_MULTILINE); 

TYPE_TEXT_VARIATION_VISIBLE_PASSWORD - 我们使用密码字符作为EditText的文本输入。它没有像.com和@键这样的表情符号和电子邮件键
TEXT_MULTILINE - 这将更改键盘布局按钮[完成]或[->]为[Enter]键,以便我们可以使用多行文本或换行功能。
在Xamarin Form中,创建一个CustomRender并在OnElementChanged方法中进行操作。

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);
                }
            }

0

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


0
在Kotlin中,为Edittext添加输入过滤器。当快速输入数字和字母时,我遇到了问题。这段代码解决了这个问题。
editText.filters = editTextAllowAlphabetsSymbols("") // Add any symbols that you wish to allow

然后这个

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

最后

class AlphabetsSymbolsInputFilter(symbols:String) : InputFilter {

private var mWordPattern: String
var mLetterPattern:String

init {
    mLetterPattern = "[a-zA-Z.$symbols ]"
    //mLetterPattern = "[a-zA-Z0-9.$symbols ]" // replace if alphanumeric
    mWordPattern = "$mLetterPattern+"
}

override fun filter(source: CharSequence, start: Int, end: Int, dest: Spanned, dstart: Int, dend: Int): CharSequence? {
    if(source == ""){
        println("In backspace")
        return source
    }
    if(source.isNotEmpty() && source.toString().matches(mWordPattern.toRegex())){
        return source
    }
    var sourceStr = ""
    if(source.isNotEmpty() && !source.toString().matches(mLetterPattern.toRegex())){
        sourceStr = source.toString()
        while(sourceStr.isNotEmpty() && !sourceStr.matches(mWordPattern.toRegex())){
            println(" source --> $source dest ---> $dest")
            if(sourceStr.last().isDigit()) {
                print("Is digit ")
                sourceStr = sourceStr.subSequence(0, sourceStr.length - 1).toString()
            }
            else if(!sourceStr.last().toString().matches(mLetterPattern.toRegex())) {
                print("Is emoji or weird symbols")
                sourceStr = sourceStr.subSequence(0, sourceStr.length - 1).toString()
            }else
                break
        }
        return sourceStr
    }
    return source
   }
}

0

安加利-系统集成的答案存在一些小问题。如果用户在任何文本后面输入表情符号而没有留下任何空格,例如“codebase”,那么文本“codebase”也会被删除。这个方法对我有用:

class EditTextForName : AppCompatEditText {
    constructor(context: Context) : super(context) {
        init()
    }

    constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
        init()
    }

    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
        context,
        attrs,
        defStyleAttr
    ) {
        init()
    }

    private fun init() {
        filters = arrayOf(EmojiExcludeFilter())
    }

    private inner class EmojiExcludeFilter : InputFilter {
        override fun filter(
            source: CharSequence,
            start: Int,
            end: Int,
            dest: Spanned,
            dstart: Int,
            dend: Int
        ): CharSequence? {
            for (i in start until end) {
                val type = Character.getType(source[i])
                if (type == SURROGATE.toInt() || type == OTHER_SYMBOL.toInt()) {
                    return source.substring(0 until i)
                }
            }
            return null
        }
    }
}

-1

目前最好的方法,在您的xml中以良好的方式工作 android:digits= "ABCDEFGHIJKLMNOPQRSTUVWXYZqwertyuiopasdfghjklmnbvcxz@.,1234567890"


"ABCDEFGHIJKLMNOPQRSTUVWXYZqwertyuiopasdfghjklmnbvcxz@.,1234567890" - PRATEEK
1
请[编辑](最好使用此信息https://stackoverflow.com/editing-help)来修复拼写错误,而不是在下面的评论中重复微妙地更改部分。另外,请解释您代码的思想。 - Yunnosch

-3

试试这个

没有什么方法可以完全禁用表情符号。你只能隐藏键盘默认的表情符号,但如果有人使用自定义键盘,你就无法隐藏自定义键盘中的表情符号。也许这个方法可以帮到你:

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

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