Как добавить хэштег в EditText при вводе пользователем текста - PullRequest
0 голосов
/ 05 мая 2020

У меня проблема с созданием хэштега в editext.

Ниже приведены мои требования

1. Каждый раз, когда пользователь запускает ввод, он начинается с ha sh. Если пользователь набирает «G», то это будет «#g» для всего слова.

2. После ввода слова и пользователя введите пробел и введите «T», затем «#t».

Я пробовал использовать список изменений текста, но у меня это не сработало.

Я пробовал использовать textwatcher:

tt = object:TextWatcher {
            override fun afterTextChanged(s: Editable) {
                edtTags.setSelection(s.length)
            }
            override fun beforeTextChanged(s:CharSequence, start:Int, count:Int, after:Int) {}
            override  fun onTextChanged(s:CharSequence, start:Int, before:Int, count:Int) {
                edtTags.removeTextChangedListener(tt)
                edtTags.setText(edtTags.getText().toString().replace(" ", " #"))
                edtTags.addTextChangedListener(tt)
            }
        }
        edtTags.addTextChangedListener(tt)

Спасибо!

1 Ответ

0 голосов
/ 07 мая 2020

Это сработало для меня в аналогичном случае:

        var isSelfChanging = false
        editText.addTextChangedListener(object : TextWatcher {
            override fun afterTextChanged(s: Editable?) {
                if (!isSelfChanging) {
                    isSelfChanging = true

                    val formattedText = ("#" + s.toString()) // adds a hashtag in start
                        .replaceFirst("##", "#") // removes initial hashtag if needed
                        .replace(" #", " ") // removes all hashtag at the begging of words
                        .replace(Regex(" (\\S)"), " #$1") // re-adds the hashtags at the begging of words
                        .toLowerCase(Locale.getDefault()) // forces lowercase
                    if (s.toString() != formattedText) {
                        s?.replace(0, s.length, formattedText, 0, formattedText.length)
                    }
                    isSelfChanging = false
                }
            }

            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
                // nothing
            }
            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                // nothing
            }
        })
    }

Это не идеально, особенно если пользователь пытается редактировать середину текста, но большинство автозаполнений не работают в этот сценарий

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...