EditText.setText()使索引超出范围

时间:2012-07-03 21:16:03

标签: android android-edittext indexoutofboundsexception

我遇到了一个错误,似乎无法解决这个问题。我正在编写一个应用,允许用户将文本从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”

1 个答案:

答案 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;
        }
    }
}

我没有测试过这个确切的片段,但是这样的代码只会在你的代码尚未运行时运行。在这种情况下,您不需要担心线程安全,因为它只是从同一个线程内部调用。