2012-12-23 2 views
1

최근 Android 4.1.1을 실행하는 ASUS Transformer Pad TF700T의 사용자 중 한 명으로부터 충돌 보고서를 받았습니다. TextViews에 대한 비슷한 충돌 보고서를 보았습니다. 일반적으로 일부 사용자 지정 코드에 대한 보고서가 다시 작성되었습니다. 이것은 WebView 용이며이 충돌과 관련하여 직접 작성한 코드는없는 것 같습니다.WebView의 IndexOutOfBoundsException

더 많은 정보가 없지만 사용자가 웹보기에 표시된 편집 상자 (웹보기에 표시된 페이지의 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) 

답변

3

어떤 이유로, 음수 시작 인덱스가있는 텍스트 선택을 시도합니다. 적어도, 그것은 stracktrace 당신이 Selection

라인 67 .: 알 수있는 작업은 다음과 같습니다

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

그래서 분명히 start-4의 값을 갖는다. 매개 변수로 전달되고 추적을 추적하면 해당 값이 DO_SET_SELECTION 메시지에서 파싱됩니다.

선택이 진행되는 동안 WebView에서 선택된 텍스트가 변경되지만 확인하기 어려운 추가 세부 정보가 없으면 오류가 발생할 수 있습니다.

흥미롭게도, BaseInputConnection.setSelection(int, int) 내 earier 추측이 더 그럴듯하게 흥미로운 코드 주석을 포함하지 :이 범위를 벗어난 확인하지만 단지 상한에서 하한하지

/** 
* 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에 대한 확인을 추가하면 stracktrace에 표시된 IndexOutOfBoundsException이 표시되지 않을 가능성이 높습니다. 이벤트 흐름을 제어 할 수 없기 때문에 안타깝게도 아마 도움이되지 않을 것입니다. WebView ...

+0

좋은 분석. 감사! 질문 : WebView에서 버그로 간주해야합니까? 텍스트가 변경 되더라도 DO_SET_SELECTION에 음의 시작 값이 포함되는 이유는 무엇입니까? –

+0

Android 5.0에서 문제가 해결되었습니다. 새로운 조건은 :'start> len || 끝> len || 시작 <0 || 끝 '0' –

관련 문제