1

我最近收到了我的一位用户关于运行 Android 4.1.1 的 ASUS Transformer Pad TF700T 的崩溃报告。我已经看到过类似的 TextViews 崩溃报告,通常会重新添加到一些自定义代码中。这是针对 WebView 的,我编写的任何代码似乎都没有与这次崩溃直接相关。

我没有更多信息,但是当用户单击 webview 中显示的编辑框时,可能会发生这种情况(我知道 webview 中显示的页面的 URL 和内容)。我不知道如何处理这个......

java.lang.IndexOutOfBoundsException: setSpan (-4 ... -4) starts before 0
at android.text.SpannableStringBuilder.checkRange(SpannableStringBuilder.java:1021)
at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:592)
at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:588)
at android.text.Selection.setSelection(Selection.java:76)
at android.view.inputmethod.BaseInputConnection.setSelection(BaseInputConnection.java:497)
at android.webkit.WebViewClassic$WebViewInputConnection.setSelection(WebViewClassic.java:482)
at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:288)
at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:77)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
4

1 回答 1

3

由于某种原因,似乎尝试进行具有负开始索引的文本选择。至少,这就是 stracktrace 告诉你的。:

第 67 行Selection

text.setSpan(SELECTION_START, start, start, Spanned.SPAN_POINT_POINT|Spanned.SPAN_INTERMEDIATE);

所以显然start有一个值-4。它作为参数传入,如果您跟踪回溯,该值将从DO_SET_SELECTION消息中解析出来。

我猜测如果在选择过程中选择的文本发生WebView变化,但没有任何难以确认的额外细节,则可能会发生错误。

有趣的是,BaseInputConnection.setSelection(int, int)它确实包含一个有趣的代码注释,使我之前的猜测更加合理:

/**
 * The default implementation changes the selection position in the
 * current editable text.
 */
public boolean setSelection(int start, int end) {
    if (DEBUG) Log.v(TAG, "setSelection " + start + ", " + end);
    final Editable content = getEditable();
    if (content == null) return false;
    int len = content.length();
    if (start > len || end > len) {
        // If the given selection is out of bounds, just ignore it.
        // Most likely the text was changed out from under the IME,
        // the the IME is going to have to update all of its state
        // anyway.
        return true;
    }
    if (start == end && MetaKeyKeyListener.getMetaState(content,
            MetaKeyKeyListener.META_SELECTING) != 0) {
        // If we are in selection mode, then we want to extend the
        // selection instead of replacing it.
        Selection.extendSelection(content, start);
    } else {
        Selection.setSelection(content, start, end);
    }
    return true;
}

有一个越界检查,但仅限于上限,而不是下限。添加一个检查start < 0 || end < 0可能会阻止IndexOutOfBoundsException你的 stracktrace 中显示的被抛出。不幸的是,这可能不会真正帮助您,因为您不太可能能够从WebView...控制事件流

于 2012-12-24T02:49:52.253 回答