Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android TextWatcher PostTextChanged()';s Editable.replace()无法正确替换EditText中的文本_Android_Android Edittext_Android Textwatcher - Fatal编程技术网

Android TextWatcher PostTextChanged()';s Editable.replace()无法正确替换EditText中的文本

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

在Android应用程序中,我有一个
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实现这一点

在后文本更改方法中,应将文本设置为编辑文本。并且字符串有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实现这一点

我已经试过了。当设置为etTemplateMessage.setText()在后文本更改()中时,只要我在$username中点击/type
e
,应用程序就会挂起。有什么想法吗?你可以用rxjava来实现。您可以创建PublishSubject对象并将其配置为200毫秒。当你停止打字的时候,只有那一次你才能工作。我会更新我的答案以便你能看到。我的错。你的解决方案有效。就在etTemplateMessage.setText()之前,我调用了text.replace()函数。因此,替换的文本被忽略,
EditText
中的文本从未更改。但是由于我调用了
setText()
方法,文本从未更改。自从
setText()触发文本更改事件以来,它进入了一个无限循环。谢谢
PublishSubject
不是必需的。很高兴知道。我已经试过了。当设置为etTemplateMessage.setText()在后文本更改()中时,只要我在$username中点击/type
e
,应用程序就会挂起。有什么想法吗?你可以用rxjava来实现。您可以创建PublishSubject对象并将其配置为200毫秒。当你停止打字的时候,只有那一次你才能工作。我会更新我的答案以便你能看到。我的错。你的解决方案有效。就在etTemplateMessage.setText()之前,我调用了text.replace()函数。因此,替换的文本被忽略,
EditText
中的文本从未更改。但是由于我调用了
setText()
方法,文本从未更改。自从
setText()触发文本更改事件以来,它进入了一个无限循环。谢谢<代码>PublishSubject
不是必需的。很高兴知道它。