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

这是我的用户界面的快照:

在此处输入图像描述

这是用户单击登录按钮时的布局。当用户点击标记为红色的左下角图标时,由于表情符号作为建议,键盘高度会增加。

请参见下面的快照:

在此处输入图像描述

有没有办法以编程方式从键盘隐藏那些顶级表情符号?

4

7 回答 7

26

试试这个它对我有用

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;
        }
    }
于 2017-08-21T11:22:39.787 回答
5

Android 有数百甚至数千种输入法编辑器(又名软键盘)。

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

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

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

由于 AFAIK 表情符号只是 Unicode 字符,并且由于您应该在其他地方支持 Unicode 字符(例如,中国字形),因此尚不清楚您必须避免使用表情符号的技术原因是什么。TextWatcher话虽如此,如果您反对表情符号,欢迎您尝试将它们从输入的文本中过滤掉(例如,使用)。

于 2016-11-30T13:16:05.423 回答
4

这可能不是最好的解决方案,但下面的代码对我来说很好:

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

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

editText.setTypeface(Typeface.DEFAULT);
于 2017-10-16T08:34:13.237 回答
2

安卓版


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

TYPE_TEXT_VARIATION_VISIBLE_PASSWORD - 我们使用密码字符作为 EditTest 的文本输入。它没有表情符号和电子邮件键,如 .com 和 @ 键 TEXT_MULTILINE - 这会将键盘布局按钮 [Done] 或 [->] 更改为 [Enter] 键,因此我们可以使用多行文本或换行功能。

以 Xamarin 形式

创建一个 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);
                }
            }
于 2020-01-20T10:00:49.377 回答
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
   }
}
于 2018-10-23T11:25:33.533 回答
0

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

于 2016-11-30T13:28:15.970 回答
-3

尝试这个

没有什么可以 100% 禁用表情符号。如果有人使用自定义键盘,您只能隐藏键盘的默认表情,您无法隐藏自定义键盘的表情,这可能会对您有所帮助

editext.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
于 2017-08-10T10:46:12.430 回答