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

时间:2019-04-03 12:15:34

标签: android android-edittext android-textwatcher

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

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

在{{1}上应用Editable的{​​{1}}方法中的afterTextChanged()参数用正确的值替换了TextWatcher,但是问题是在{{1 }}被替换为实际的用户名,如果我在按下任何字符后再附加EditText,然后再按下字符。

例如

说当前登录的用户名是$username

a。如果输入是$username

b。 username更改为Joe

c。现在,如果我按任何其他字符(例如我按g OR空格),则Hi this is @username中的文本将变为afterTextChanged()Hi this is Joe

如何像步骤EditText一样获得输出?

Hi this is Joeusernameg

1 个答案:

答案 0 :(得分:2)

在afterTextChange方法上,应将文本设置为编辑文本。并且String具有replace(CharSequence旧,CharSequence新)方法,您也可以使用它。 像这样

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实现此目的。