我遇到了一个错误,似乎无法解决这个问题。我正在编写一个应用,允许用户将文本从EditText
发送到TextView
。如果用户出错,则用户可以点击空格键以将EditText
发送的最新文本带到TextView
。这有时会起作用,但有时候,它会给我一个IndexOutOfBounds
例外。
textInput是一个EditText,back1,2,3是最近的三个字符串(back1是最近的字符串)
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(count==1&&before==0&&s.toString().equals(" ")){
textInput.setText(back1);
}else if(s.toString().equals(back1 + " ")){
textInput.setText(back2);
}else if(s.toString().equals(back2 + " ")){
textInput.setText(back3); //causes error if back2 > back3
}
textInput.setSelection(textInput.getText().toString().length());
以上代码检查用户是否按下了空格键,如果是,则检查该怎么办。如果用户在空的EditText上按空格,他们就会得到他们发送的最后一件事。如果他们再次进入太空,他们会得到他们发送的最后一件事,依此类推。这仍然有点粗糙,但我希望你明白这一点。
OutOfBounds异常来自于EditText
中的大项,命中空格,以及将EditText
设置为较小的字符串。我认为这是因为光标位于EditText
的末尾,当文本变小时,光标不再存在,所以我尝试在textInput.setSelection(0)
之前添加setText()
。这没有用。我还尝试将EditText
设置为setText("")
。那也行不通。如果我注释掉setText(back#)
的行,那么一切正常。
一个例子:
用户按此顺序键入“hello”,“hi”和“hey”。
back3 =你好,back2 = hi,back1 =嘿。
按一次空格会将EditText设置为“hey”
第二次点击将崩溃,因为setSpan(3...4) ends beyond length 2
,可能是因为后面1大于后面2。它应该将EditText
中的文本设置为“hi”
答案 0 :(得分:3)
来自the TextWatcher
documentation:
public abstract void onTextChanged (CharSequence s, int start, int before, int count)
自:API Level 1
系统会调用此方法通知您,在
s
内,count
开头的start
字符刚刚替换了长度为before
的旧文本。 尝试从此回调中更改s
是错误的。
(我的重点。)
如果您想更改文本以响应现有更改,则应使用afterTextChanged
。即使在这种情况下,当您从afterTextChanged
更改文本时,也会重新调用您的处理程序,因此请使用额外的预防措施以确保您不会进入无限循环,例如:< / p>
public void afterTextChanged (Editable s) {
static boolean is_reentrant = false;
if (!is_reentrant) {
is_reentrant = true;
try {
// do stuff
} finally {
is_reentrant = false;
}
}
}
我没有测试过这个确切的片段,但是这样的代码只会在你的代码尚未运行时运行。在这种情况下,您不需要担心线程安全,因为它只是从同一个线程内部调用。