TextWatcher afterTextChanged () Editable.replace () не заменяет текст в EditText должным образом - PullRequest
0 голосов
/ 03 апреля 2019

В приложении Android у меня есть EditText, который должен заменить определенные строки значениями из данных приложения.

например если пользователь вводит $username, его следует заменить именем того пользователя, который в данный момент вошел в систему.

Параметр Editable в методе afterTextChanged() TextWatcher, примененном к EditText, заменяет $username на правильное значение, но проблема в том, что после замены $username на действительное имя пользователя, если я нажимаю любой символ после этого к нему добавляется username, за которым следует нажатый символ.

например.

Скажите, что текущее имя пользователя Joe

а. если ввод Hi this is @username

б. afterTextChanged() меняет его на Hi this is Joe

с. Теперь, если я нажимаю любой другой символ (скажем, я нажимаю g ИЛИ пробел), тогда текст в EditText меняется на Hi this is Joeusernameg ИЛИ Hi this is Joeusername

Как получить вывод, как на шаге b?

etTemplateMessage.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {
            final String strUserNameCode = "$username";
            String text = s.toString();
            if(text.contains(strUserNameCode)){
                int startIndex = text.indexOf(strUserNameCode);
                int endIndex = startIndex + strUserNameCode.length();
                Editable profileName = new SpannableStringBuilder(FileUtil.getUTF8String(settingDTO.getProfileName()));
                s.replace(startIndex, endIndex, profileName);
            }

        }
    });

1 Ответ

2 голосов
/ 03 апреля 2019

в вашем методе afterTextChange вы должны установить текст для редактирования текста.И String имеет метод замены (CharSequence old, CharSequence new), который вы также можете использовать.например,

PublishSubject publishSubject = PublishSubject.create();
        publishSubject.debounce(200, TimeUnit.MILLISECONDS)
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(query -> onTextChanged(query.toString()));


void onTextChanged(String text){
 final String strUserNameCode = "$username";
     etTemplateMessage.setText(text.replace(strUserNameCode, FileUtil.getUTF8String(settingDTO.getProfileName())));
}

и при вызове метода aftertextChange publishSubject.onNext( s.toString())

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