在Android应用程序中,我有一个EditText
应该用应用程序数据中的值替换某些字符串。
例如,如果用户键入$username
则应将其替换为当前登录的用户的名称。
应用于EditText
afterTextChanged()
TextWatcher
方法中的Editable
参数将$username
替换为正确的值,但问题是,如果我按任何字符,则在$username
被替换为实际用户名后,它会附加username
后跟按下的字符。
例如
假设当前登录的用户名为Joe
a. 如果输入Hi this is @username
二. afterTextChanged()
将其更改为Hi this is Joe
三.现在,如果我按任何其他字符(例如我按 g OR 空格(,那么 EditText
中的文本将更改为 Hi this is Joeusernameg
OR 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方法上,你应该将文本设置为编辑文本。和字符串有替换(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())));
}
并在您的后文更改方法调用publishSubject.onNext( s.toString())
- 请注意,您可以使用 RxJava 实现这一点。