在Android应用程序中,我有一个EditText
,它应该用app数据中的值替换某些字符串。
例如如果用户键入$username
,它应该替换为当前登录的用户的名称。
应用于Editable
的afterTextChanged()
的TextWatcher
方法中的EditText
参数用$username
替换正确值,但问题是在用实际用户名替换$username
之后,如果我按下任何字符,则附加username
后跟压制字符。
EG
说当前登录的用户名是Joe
一个。如果输入是Hi this is @username
湾afterTextChanged()
将其更改为Hi this is Joe
C。现在,如果我按任何其他字符(比如我按g OR空格),那么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);
}
}
});
在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())