【问题标题】:How to disable emojis programmatically in Android如何在 Android 中以编程方式禁用表情符号
【发布时间】:2017-04-14 19:23:28
【问题描述】:

我想以编程方式从键盘隐藏表情符号和自动建议。它适用于某些 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());

这是我的 UI 快照:

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

见下图:

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

【问题讨论】:

    标签: android android-softkeyboard emoji android-viewtreeobserver


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 这是最好的答案,一个对我很有效的简单 TextWatcher 是在 stackoverflow.com/questions/22990870/… 找到的 EmojiExcludeFilter
    • 使用 TextWatcher 过滤掉输入的每个表情符号是目前最好的解决方案。
    • 很好的答案,但是,IMO,即使在 Unicode 中工作也至少有一个技术原因(我已经遇到过几次):将用户的数据上传到 utf8 格式的 MySQL 数据库,因为它没有'不接受表情符号,如here 所述。有时,我们无法控制数据库,因此阻止表情符号是唯一的方法。
    • @thelawnmowerman:那么这是应用程序级别的数据验证问题。就个人而言,我没有尝试过the answer that uses an InputFilter,但这是前进的大方向。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      试试这个

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

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

      【讨论】:

        【解决方案4】:

        试试这个对我有用

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

        【讨论】:

          【解决方案5】:

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

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

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

          editText.setTypeface(Typeface.DEFAULT);
          

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

              适用于 Android

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-02-22
                • 1970-01-01
                • 2021-10-06
                • 1970-01-01
                • 1970-01-01
                • 2011-11-13
                相关资源
                最近更新 更多