Изменение цвета edittext Android для @mentions и #hashtags при наборе текста

У меня есть edittext и когда пользователь вводит в него цвет, необходимо изменить цвет @mentions и #hashtags . Я использовал textwatcher но он textwatcher и он пропускает некоторые символы при наборе текста. Я хотел бы услышать об альтернативах.

Это мой код:

 var previousString = "" override fun initTextAreaView() { if(twitterAvailable && twitterIsEnabled) CHARLIMIT = 280 if(!twitterIsEnabled && linkedInAvailable && linkedInIsEnabled) CHARLIMIT = 700 charcount.text = CHARLIMIT.toString() content.addTextChangedListener(object : TextWatcher { override fun afterTextChanged(s: Editable?) {} override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { if(s.toString()!=previousString)checkMentionsAndHashtags(s.toString()) } }) } var textSpanList: ArrayList<TextSpan> = ArrayList() private fun checkMentionsAndHashtags(s: String) { previousString = s textSpanList = ArrayList() val words = s.split(" ") for(word in words){ if(word.length>0) { if (word[0] == '@' || word[0] == '#') { val n = s.lastIndexOf(word) textSpanList.add(TextSpan(n, (n+word.length))) } } } changeTextColor(s, SpannableStringBuilder(s)) } private fun changeTextColor(s: String = "", str: SpannableStringBuilder = SpannableStringBuilder("")) { Log.d("TEXTSPANS", textSpanList.toString()) if(textSpanList.size>0){ for(span in textSpanList) { str.setSpan(ForegroundColorSpan(resources.getColor(R.color.colorPrimary)), span.startPos, span.endPos, 0) } } val cursorPos = content.selectionEnd content.text = str content.setSelection(cursorPos) } 

вы должны попробовать это

  lateinit var content:EditText private var intCount = 0 private var initialStringLength = 0 private var strText = "" private fun initTextAreaView() { content= findViewById(R.id.testText) content.addTextChangedListener(object : TextWatcher { override fun afterTextChanged(s: Editable?) {} override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { val typedString = s.toString() val stringArrayObj = typedString.split(" ".toRegex()).dropLastWhile({ it.isEmpty() }).toTypedArray() var cnt = 0 if (typedString.length != initialStringLength && typedString.length != 0) { if (typedString.substring(typedString.length - 1) != " ") { initialStringLength = typedString.length cnt = intCount for (i in stringArrayObj.indices) if (stringArrayObj[i].get(0) == '#' || stringArrayObj[i].get(0) == '@') { strText = strText + " " + "<font color='#EE0000'>" + stringArrayObj[i] + "</font>" } else strText = strText + " " + stringArrayObj[i] } if (intCount == cnt) { intCount = stringArrayObj.size content.setText(Html.fromHtml(strText)) content.setSelection(content.getText().toString().length) } } else { strText = "" } } }) } 
Intereting Posts
Файл открытого актива Android Kotlin Функцию можно написать в Котлине (т.е. на верхнем уровне). Могу ли я также тестировать те, кто находится на верхнем уровне? ': app: kaptDebugKotlin' ошибка в Android-студии 3 стабильной версии с номером 1 (RC) Android numberPicker, передающий виджет Android в качестве значения Как отключить кнопку точки в android Kotlin как скомпилировать kotlin в веб-проекте eclipse maven AndroidStudio ExternalSystemException с kotlin 0.12.213 Используя Kovenant от Kotlin, я продолжаю использовать повторяющийся код, используя Deferred Kotlin: почему параметры конструктора имеют «внутреннюю» видимость по умолчанию? Можем ли мы представить «self class» в Java (или Kotlin)? Как я могу более легко использовать транзакции Jooq в Котлине У Kotlin 1.2.10 и Java 9 есть противоположные правила относительно автоматических модулей? Что лучше для разработки приложений для Android? Это kotlin или java? Используется плагин kotlin-spring, все еще получающий класс не открытую ошибку Kotlin: java.lang.NoSuchMethodError в тестах