In the Android app, I have an EditText
which should replace certain strings with values from app data.
for e.g. if user types $username
it should get replaced with the name of whichever user is currently logged in.
The Editable
parameter in afterTextChanged()
method of TextWatcher
applied on EditText
replaces the $username
with correct value but the problem is that after the $username
is replaced with actual username if I press any character after that it is appended with username
followed by pressed character.
e.g.
Say current logged in username is Joe
a. if the input is Hi this is @username
b. afterTextChanged()
changes it to Hi this is Joe
c. Now if I press any other character(say I press g OR space) then text in EditText
changes to Hi this is Joeusernameg
OR Hi this is Joeusername
How do I get output as in step 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);
}
}
});