Как отключить эмодзи программно в Android

Я хочу, чтобы программно скрывать смайлики и авто предложения от клавиатуры. Это работает на некоторых устройствах 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());

Вот снимок моего пользовательского интерфейса:

Это макет, когда пользователь нажимает кнопку входа. Когда пользователь нажимает на нижний левый значок, который отмечен красным, высота клавиатуры увеличивается из-за смайликов в качестве подсказок.

Смотрите ниже снимок:

Есть ли способ программно скрыть эти лучшие смайлики от клавиатуры?

9 ответов

Попробуйте это, это работает для меня

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

Существуют сотни, если не тысячи редакторов методов ввода (или программных клавиатур) для Android.

Никто не должен предлагать смайлики. Те, кто это делают, могут предлагать их так, как им хочется, в любое время.

Для редактора метода ввода не требуется соблюдать какие-либо флаги, которые вы ставите на EditText, Поэтому редактору методов ввода не требуется предлагать какие-либо средства для блокировки ввода эмодзи. И даже если некоторые действительно предлагают эту возможность, другие могут и не делать, а те, которые делают это, могут использовать другие флаги.

Решение о том, иметь ли параметр Emoji на клавиатуре, принимается разработчиками клавиатуры и пользователем (который выбирает клавиатуру для использования). Вы не получите голос.

Так как смайлики AFAIK являются просто символами Юникода, и поскольку вы должны поддерживать символы Юникода в других местах (например, китайские глифы), неясно, по какой технической причине вам следует избегать смайликов. При этом вы можете попытаться отфильтровать их от вводимого текста (например, использовать TextWatcher), если вы против смайликов.

Вероятно, это не лучшее решение, но приведенный ниже код отлично сработал:

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

и так как тип ввода пароля меняет шрифт, вы просто устанавливаете на него гарнитуру по умолчанию:

editText.setTypeface(Typeface.DEFAULT);

Для Android


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

TYPE_TEXT_VARIATION_VISIBLE_PASSWORD - мы используем символ пароля в качестве ввода текста для EditTest. У него нет эмодзи и ключей электронной почты, таких как.com и @ keys. TEXT_MULTILINE - это изменит кнопку раскладки клавиатуры [Готово] или [->] на клавишу [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);
                }
            }

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

С ответом Анджали-Систематикс есть небольшая проблема. Если пользователь вводит смайлик после любого текста без пробела, например «кодовая база», текст «кодовая база» также удаляется. Это сработало для меня:

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

Попробуй это

Нет ничего, что могло бы на 100% отключить эмодзи. Вы можете только скрыть эмоции клавиатуры по умолчанию, независимо от того, использует ли пользовательскую клавиатуру эмоции, вы не можете скрыть эмоции клавиатуры пользователя, возможно, это поможет вам

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

Это может быть полезно для вас, это отключит эмодзи для Android: inputType = "textShortMessage". Пожалуйста, дайте мне знать, если это вам не поможет

Лучший метод до сих пор и хорошо работает в вашем xml, напишите android:digits=" [email protected] , 1234567890"

Другие вопросы по тегам