0

我有一个错误,我似乎无法理解。我正在编写一个应用程序,允许用户将文本从a 发送EditText到 a 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(). 那没有帮助。我也尝试设置EditTextsetText(""). 那也没有用。如果我注释掉 的行setText(back#),一切正常。

一个例子:

用户按顺序输入“hello”、“hi”和“hey”。

back3 = 你好,back2 = 你好,back1 = 你好。

点击空格一次会将 EditText 设置为“嘿”

第二次点击会崩溃,因为setSpan(3...4) ends beyond length 2,大概是因为 back 1 大于 back2。应该将文本中的文本设置EditText为“hi”

4

1 回答 1

3

文档TextWatcher

public abstract void onTextChanged (CharSequence s, int start, int before, int count)

自:API 级别 1

调用此方法是为了通知您,在 内s,以count开头的字符start刚刚替换了具有 length 的旧文本before尝试s从此回调进行更改是错误的。

(我的重点。)

afterTextChanged如果您想更多地更改文本以响应现有更改,则应改为使用。即使在这种情况下,当您从 更改文本时,您的处理程序也会被重新调用afterTextChanged,因此请使用额外的预防措施以确保您不会陷入无限循环,例如:

public void afterTextChanged (Editable s) {
    static boolean is_reentrant = false;

    if (!is_reentrant) {
        is_reentrant = true;
        
        try {
            // do stuff
        } finally {
            is_reentrant = false;
        }
    }
}

我还没有测试过这个确切的代码片段,但是类似的东西会让你的代码只有在它还没有运行时才运行。在这种情况下,您无需担心线程安全,因为它只是从同一个线程内部调用。

于 2012-07-03T22:16:54.080 回答