Страницы

Поиск по вопросам

четверг, 13 февраля 2020 г.

Сделать EditText который позволяет написать только один любой emoji icon или один любой символ

#java #android #kotlin #emoji


Условия: Есть приложение, содержащее EditText.

Задача: Сделать EditText, который позволяет вписать в себя только один любой Emoji
icon или какой-нибудь один символ.

Идеи: Я пробовал прописать в параметрах EditText android:maxLength="1", но в таком
случае некоторые emoji просто не пишутся. Предполагаю, это происходит потому, что некоторые
emoji состоят из нескольких других emoji, которые в последствии объединяются, то есть
они имеют длину больше одного символа.

Вопрос: Как осуществить задуманное?
    


Ответы

Ответ 1



Используйте Emoji Compatibility support library.

Ответ 2



Удалось реализовать без дополнительных библиотек: Создаём Boolean переменную editTextFlag, которая используется для того, чтобы пресекать бесконечные изменения текста в EditText, вызванные в результате команд MyEditText.setText(...). (Дальше станет понятнее зачем нужна эта переменная.) Ставим на EditText улавливатель изменений текста (ввода или удаления) командой .addTextChangedListener(...). В нём по дефолту находится три функции: afterTextChanged, beforeTextChanged и onTextChanged. Нам понадобится только одна: "beforeTextChanged", которая вызывается за момент до того, как введётся текст. s - в данной функции это текст, который был в EditText до изменения after - количество символов в EditText после изменения В "beforeTextChanged" я создал три условия: (editTextFlag && after == 0) - вызывается когда пользователь удаляет символ или emoji, то есть количество символов в EditText после изменения равно 0 (editTextFlag && HabitIconEditText.text.isNotEmpty()) - вызывается, когда в EditText уже есть какой-то символ или emoji icon и пользователь пытается добавить ещё один. Мы ему это не позволяем и пишем в EditText текст, который был до изменения, то есть текст s, командой MyEditText.setText(s). Ну и для красоты перемещаем курсор EditText в конец строки командой MyEditText.setSelection(s.length). Ну else вызывается когда не подходит ни одно из вышеперечисленных условий. В данном случае оно просто переключает переменную editTextFlag обратно на true. Дело в том, что при вызове команды .setText( ... ) addTextChangedListener вызывается второй раз. Так как при первом вызове editTextFlag переключилось на false, то нужно вернуть эту переменную обратно на на true, делается это как раз при втором вызове, в этом условии else. Вот собсна сам код: var editTextFlag = true MyEditText.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) { when { (editTextFlag && after == 0) -> { editTextFlag = false MyEditText.setText("") } (editTextFlag && HabitIconEditText.text.isNotEmpty()) -> { editTextFlag = false MyEditText.setText(s) MyEditText.setSelection(s.length) } else -> { editTextFlag = true } } } override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {} override fun afterTextChanged(s: Editable) {} })

Комментариев нет:

Отправить комментарий