TextWatcher afterTextChanged()的Editable.replace()不能正确替换EditText中的文本

问题描述 投票:0回答:1

在Android应用程序中,我有一个EditText,它应该用app数据中的值替换某些字符串。

例如如果用户键入$username,它应该替换为当前登录的用户的名称。

应用于EditableafterTextChanged()TextWatcher方法中的EditText参数用$username替换正确值,但问题是在用实际用户名替换$username之后,如果我按下任何字符,则附加username后跟压制字符。

EG

说当前登录的用户名是Joe

一个。如果输入是Hi this is @username

afterTextChanged()将其更改为Hi this is Joe

C。现在,如果我按任何其他字符(比如我按g OR空格),那么EditText中的文本将更改为Hi this is JoeusernamegHi 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);
            }

        }
    });
android android-edittext android-textwatcher
1个回答
2
投票

在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实现此目的。
© www.soinside.com 2019 - 2024. All rights reserved.