#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) {} })
Комментариев нет:
Отправить комментарий