IndexOutOfBoundsException при нажатии на FAB с EditText на Oreo - PullRequest
0 голосов
/ 28 мая 2018

Я получаю ошибку «java.lang.IndexOutOfBoundsException», возникающую, когда пользователь нажимает на FAB, чтобы добавить таймер, или нажимает на цифровую кнопку TimerEditActivity.Это происходит исключительно на Android 8.0.Я пробовал разные подходы, но на самом деле не знаю, как это исправить.

void onClick(TextView view) {
        if (mFocusGrabber.isFocused())
            return;
        EditText field = getFocusedField();
        int at = field.getSelectionStart();
        field.getText().replace(at, at + 1, view.getText()); //LINE 116, causing the error
        field.setSelection(at + 1);
//        updateStartButtonVisibility();
        if (field.getSelectionStart() == FIELD_LENGTH) {
            // At the end of the current field, so try to focus to the next field.
            // The search will return null if no view can be focused next.
            View next = field.focusSearch(View.FOCUS_RIGHT);
            if (next != null) {
                next.requestFocus();
                if (next instanceof EditText) {
                    // Should always start off at the beginning of the field
                    ((EditText) next).setSelection(0);
                }
            }
        }
    }

Это трассировка стека из Play Console.Линии 116, кажется, виновником.

    at android.text.SpannableStringBuilder.checkRange (SpannableStringBuilder.java:1309)
      at android.text.SpannableStringBuilder.replace (SpannableStringBuilder.java:510)
      at android.text.SpannableStringBuilder.replace (SpannableStringBuilder.java:504)

      at android.text.SpannableStringBuilder.replace (SpannableStringBuilder.java:502)
      at be.demillennial.oneclock.timers.EditTimerActivity.onClick (EditTimerActivity.java:116)

      at be.demillennial.oneclock.timers.EditTimerActivity$$ViewBinder$7.doClick (EditTimerActivity$$ViewBinder.java:92)
      at butterknife.internal.DebouncingOnClickListener.onClick (DebouncingOnClickListener.java:22)
      at android.view.View.performClick (View.java:6891)
      at android.widget.TextView.performClick (TextView.java:12651)
      at android.view.View$PerformClick.run (View.java:26083)
      at android.os.Handler.handleCallback (Handler.java:789)
      at android.os.Handler.dispatchMessage (Handler.java:98)
      at android.os.Looper.loop (Looper.java:164)
      at android.app.ActivityThread.main (ActivityThread.java:6938)
      at java.lang.reflect.Method.invoke (Native Method)
      at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:327)
      at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1374)

1 Ответ

0 голосов
/ 28 мая 2018

Эта строка обязательно завершится сбоем, если ваш выбор находится в конце

field.getText().replace(at, at + 1, view.getText());

Если у вас есть 6 символов в редактируемом тексте, вы не можете заменить значения между 6-7.Он всегда будет через IndexOutOfBoundsException

Поставить проверку, как вы делали в следующей строке, и она не вылетит

if (field.getSelectionStart() <= FIELD_LENGTH) {
...