当前位置: 首页 > 知识库问答 >
问题:

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

姜钧
2023-03-14

在Android应用程序中,我有一个< code>EditText,它应该用应用程序数据中的值替换某些字符串

例如,如果用户键入$username则应将其替换为当前登录的用户的名称。

EditText 上应用的文本观察器afterTextChanged() 方法中的可编辑参数将$username替换为正确的值,但问题是,如果我按下任何字符,则在$username被替换为实际用户名之后,它会附加用户名后跟按下的字符。

e. g.

假设当前登录的用户名是

a、 如果输入嗨,这是@username

b.< code>afterTextChanged()将其更改为< code >嗨,我是乔

C。现在,如果我按任何其他字符(比如我按g或空格),然后EditText中的文本更改为嗨,这是JoeusernamegOR嗨,这是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);
            }

        }
    });

共有1个答案

魏明亮
2023-03-14

在您的afterTextChange方法中,您应该将文本设置为编辑文本。而且String有replace(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())));
}

并在您的后文本更改方法调用发布子主题.onNext( s.到字符串())

  • 请注意,您可以使用RxJava实现这一点。
 类似资料:
  • 我有Maven应用程序,具有3个不同的配置文件,如下所示 我有这样的Maven结构: src/main/config/default/WEB-INF/WEB。xml src/main/config/dev/WEB-INF/WEB。xml src/main/config/test/WEB-INF/web.xml src/main/config/prod/WEB-INF/web.xml src/mai

  • 问题内容: 有没有办法替换放置在HTML正文中的table元素内的普通文本? 喜欢用“ hi”代替“ hello”吗? 请仅使用不带 jQuery的* JavaScript 。 * 问题答案: 要用另一个字符串替换HTML中的字符串,请使用innerHTML的replace 请注意,这将替换整个正文的第一个实例,包括HTML代码中的任何实例(例如,类名等。),因此请谨慎使用- 为了获得更好的结果,

  • 在RestEasy 3.0.16中,最终版本PreProcessInterceptor接口是不推荐的。那么这个接口的适当替换是什么。在jboss EAP7中,RestEasy Version3.0.16.final被使用。

  • 我试着这样读: 我尝试只打印出字符串(当我创建string str=new string(allBytes,“UTF-8”)时),但我得到的只是开头的一个正方形,然后是70多个没有文本的空行。然后我尝试了int charCode=integer.parseint(str.substring(I,I+8),2);并打印出每个单独的字符,但我得到了一个NumberFormatException。我甚至

  • 问题内容: 我目前正在开发一个简单的聊天应用程序。我想在此应用程序中添加表情符号功能。我已经有一个从其他用户接收字符串的功能。我想要的是- 如果用户发送的文本包含CharSequence之类的字符,例如“:D”或“:p”,我希望将它们更改为表情符号。如何实现此功能? 我想要这样的功能: 如果可以的话,请帮助我。如果还有其他方法,请提及它们。 问题答案: 你可以这样尝试

  • 无法在表列中发送值。当我试图使用Selenium在列中插入值时,我得到了不同的错误。 > 然后单击并编辑该值。 传递的值未插入表列中。但是我可以单击Tables列。我的考试通过了。 然后尝试设置值。它显示超时的错误。 我再次使用div/span组合作为XPath,并编辑了该值。但这并没有反映在表中。 在这里我没有得到任何错误。但保存后未反映该值。 我给元素添加了各种格式。 div/[id] HTM