Java 使用Oreo上的EditText单击FAB时出现IndexOutOfBoundsException

Java 使用Oreo上的EditText单击FAB时出现IndexOutOfBoundsException,java,android,indexoutofboundsexception,Java,Android,Indexoutofboundsexception,当用户单击晶圆厂添加计时器或单击TimerEditActivity上的数字按钮时,会引发“java.lang.IndexOutOfBoundsException”错误。这只发生在Android 8.0上。我尝试了不同的方法,但不知道如何解决这个问题 void onClick(TextView view) { if (mFocusGrabber.isFocused()) return; EditText field = getFocusedF

当用户单击晶圆厂添加计时器或单击TimerEditActivity上的数字按钮时,会引发“java.lang.IndexOutOfBoundsException”错误。这只发生在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);
                }
            }
        }
    }
这是来自游戏控制台的stacktrace。第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)

如果您的选择在末尾,此行肯定会崩溃

field.getText().replace(at, at + 1, view.getText());
如果编辑文本中有6个字符,则不能替换6-7之间的值。它将始终通过IndexOutOfBoundsException

像你在下一行那样放一张支票,它就不会崩溃了

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

if(field.getSelectionStart()如果您的选择在末尾,这一行肯定会崩溃

field.getText().replace(at, at + 1, view.getText());
如果编辑文本中有6个字符,则不能替换6-7之间的值。它将始终通过IndexOutOfBoundsException

像你在下一行那样放一张支票,它就不会崩溃了

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

if(field.getSelectionStart()此行引发错误
field.getText().replace(at,at+1,view.getText())
这意味着
at
at+1
是大索引还是低索引。我认为当用户选择字段的最后一个字符时,
at+1
太大,然后
at+1
不在字段中,并给您一个异常。您需要添加一个if条件来检查
at+1
是否在索引中在调用
replace()
之前,该错误由以下行引发
field.getText().replace(at,at+1,view.getText())
这意味着
at
at+1
是大索引还是低索引。我认为当用户选择字段的最后一个字符时,
at+1
太大,然后
at+1
不在字段中,并给您一个异常。您需要添加一个if条件来检查
at+1
是否在索引中在调用
replace()
谢谢!但是必须稍微更改您的解决方案。必须用哦耶抱歉我忘了:p谢谢!但是必须稍微更改您的解决方案。必须用哦耶抱歉我忘了:p检查if条件