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



在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 实现这一点。

相关内容

  • 没有找到相关文章

最新更新