Android TextWatcher PostTextChanged()';s Editable.replace()无法正确替换EditText中的文本
在Android应用程序中,我有一个Android TextWatcher PostTextChanged()';s Editable.replace()无法正确替换EditText中的文本,android,android-edittext,android-textwatcher,Android,Android Edittext,Android Textwatcher,在Android应用程序中,我有一个EditText,它应该用应用程序数据中的值替换某些字符串 例如,如果用户类型$username,则应将其替换为当前登录的用户的名称 posterextchanged()中的Editable参数在EditText上应用的TextWatcher方法将$username替换为正确的值,但问题是在$username之后,如果我按下任何字符,它将被替换为实际的用户名,之后会附加username,后跟按下的字符 e、 g 假设当前登录的用户名是Joe a。如果输入为Hi
EditText
,它应该用应用程序数据中的值替换某些字符串
例如,如果用户类型$username
,则应将其替换为当前登录的用户的名称
posterextchanged()中的Editable
参数
在EditText
上应用的TextWatcher
方法将$username
替换为正确的值,但问题是在$username
之后,如果我按下任何字符,它将被替换为实际的用户名,之后会附加username
,后跟按下的字符
e、 g
假设当前登录的用户名是Joe
a。如果输入为Hi,则为@username
b<代码>后文本更改()
c。现在,如果我按任何其他字符(比如按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);
}
}
});
在后文本更改方法中,应将文本设置为编辑文本。并且字符串有replace(charsequenceold,charsequencenew)方法,您也可以使用它。 像这样,
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())));
}
在您的PostTextChange方法调用publishSubject.onNext(s.toString())
- 请注意,您可以使用RxJava实现这一点
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())));
}
在您的PostTextChange方法调用publishSubject.onNext(s.toString())
- 请注意,您可以使用RxJava实现这一点
e
,应用程序就会挂起。有什么想法吗?你可以用rxjava来实现。您可以创建PublishSubject对象并将其配置为200毫秒。当你停止打字的时候,只有那一次你才能工作。我会更新我的答案以便你能看到。我的错。你的解决方案有效。就在etTemplateMessage.setText()之前,我调用了text.replace()函数。因此,替换的文本被忽略,EditText
中的文本从未更改。但是由于我调用了setText()
方法,文本从未更改。自从setText()触发文本更改事件以来,它进入了一个无限循环。谢谢PublishSubject
不是必需的。很高兴知道。我已经试过了。当设置为etTemplateMessage.setText()在后文本更改()中时,只要我在$username中点击/typee
,应用程序就会挂起。有什么想法吗?你可以用rxjava来实现。您可以创建PublishSubject对象并将其配置为200毫秒。当你停止打字的时候,只有那一次你才能工作。我会更新我的答案以便你能看到。我的错。你的解决方案有效。就在etTemplateMessage.setText()之前,我调用了text.replace()函数。因此,替换的文本被忽略,EditText
中的文本从未更改。但是由于我调用了setText()
方法,文本从未更改。自从setText()触发文本更改事件以来,它进入了一个无限循环。谢谢<代码>PublishSubject
不是必需的。很高兴知道它。