2012-07-03 3 views
0

У меня ошибка. Кажется, я не могу обернуть голову. Я пишу приложение, которое позволяет пользователю отправлять текст с EditText на номер TextView. Если пользователь допустил ошибку, пользователь может нажать клавишу пробела, чтобы принести самый последний текст, отправленный с EditText в TextView. Это работает иногда, но в других случаях это дает мне исключение IndexOutOfBounds.EditText.setText() дает индекс за пределами

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#), все будет хорошо.

Пример:

типы

пользователя в «Привет», «Привет» и «Эй» в этом порядке.

задний3 = привет, задний2 = привет, и задний1 = эй.

задерживаясь пространство сразу задаст EditText к «эй»

Второй кран будет врезаться, так как setSpan(3...4) ends beyond length 2, предположительно потому, что назад 1 больше, чем Назад2. Предполагается установить текст в EditText на "привет"

+0

Опубликовать stacktrace. – FoamyGuy

+1

Я не прочитал весь вопрос, но должен строка textInput.setSelection (textInput.getText(). ToString(). Length()); not textInput.setSelection (textInput.getText(). toString(). length() - 1) ;? –

+0

Нет, setSelection() работает как ожидается при переходе от маленького> большого. Кроме того, ошибка более чем одна. –

ответ

3

От the TextWatcher documentation:

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

С: Уровень API 1

Этот метод вызывается, чтобы уведомить вас, что, в s , цифры count, начинающиеся с start, только что заменили старый текст длиной before. Ошибка при попытке внести изменения в s из этого обратного вызова.

(курсив мой.)

Вы должны использовать afterTextChanged вместо этого, если вы хотите изменить текст больше в ответ на существующие изменения. Даже в этом случае, ваш обработчик будет вызываться повторно entrantly при изменении текста из afterTextChanged, поэтому использовать дополнительные меры предосторожности, чтобы убедиться, что вы не получите в бесконечный цикл, например, что-то вроде этого:

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

    if (!is_reentrant) { 
     is_reentrant = true; 

     try { 
      // do stuff 
     } finally { 
      is_reentrant = false; 
     } 
    } 
} 

Я не тестировал этот точный фрагмент, но что-то подобное сделает ваш код запущенным только в том случае, если он еще не запущен.В этом случае вам не нужно беспокоиться о безопасности потоков, потому что он вызывается только из одного потока.

+0

А, я неправильно понял, что было. Я думал, что это новая строковая копия текста в EditText. Я не думал, что это был фактический объект текста в EditText. Является ли это фактическим текстовым объектом в тексте редактирования? В любом случае, перемещение его в afterTextChanged работает. Благодарю. –

+0

Я не знаю, является ли это фактическим объектом или копией, обработанной далее после возвращения onTextChanged, но изменения в 's' * * отражены в содержимом' EditText'. –

+0

Не понял, что. Благодарю. –

Смежные вопросы