2017-02-03 74 views
0

我們有一個Xamarin的Android應用程序,是有時遇到下列崩潰:內部Android崩潰在Xamarin周圍SetSpan

d Java.Lang.RuntimeExceptionsetSpan (13 ... 31) ends beyond length 18 
Raw 

    --- End of managed Java.Lang.RuntimeException stack trace --- 
java.lang.IndexOutOfBoundsException: setSpan (13 ... 31) ends beyond length 18 
    at android.text.SpannableStringBuilder.checkRange(SpannableStringBuilder.java:1016) 
    at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:592) 
    at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:588) 
    at android.widget.TextView.setSpan_internal(TextView.java:8753) 
    at android.widget.Editor$SuggestionsPopupWindow.onItemClick(Editor.java:2789) 
    at android.widget.AdapterView.performItemClick(AdapterView.java:299) 
    at android.widget.AbsListView.performItemClick(AbsListView.java:1113) 
    at android.widget.AbsListView$PerformClick.run(AbsListView.java:2904) 
    at android.widget.AbsListView$3.run(AbsListView.java:3638) 
    at android.os.Handler.handleCallback(Handler.java:733) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5050) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:780) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:596) 
    at dalvik.system.NativeStart.main(Native Method) 

經過一番調查後,我們確定是什麼原因導致大跌,以及其他人如何(使用普通Android的,不Xamarin,已經解決了它):

https://code.google.com/p/android/issues/detail?id=82788

的解決方案是延長的EditText並覆蓋二級保護方法:

protected void setSpan_internal(Object span, int start, int end, int flags) { 
    final int textLength = getText().length(); 
    ((Editable) getText()).setSpan(span, start, Math.min(end, textLength), flags); 
} 

protected void setCursorPosition_internal(int start, int end) { 
    final int textLength = getText().length(); 
    Selection.setSelection(((Editable) getText()), Math.min(start, textLength), Math.min(end, textLength)); 
} 

很好,一個簡單的解決方案。當然,除了包裝Xamarin時,Xamarin似乎會將這些方法隱藏起來。它們不能在EditText(或TextView)的Xamarin實現中訪問。

那麼有沒有人有任何想法如何解決Xamarin內的這個問題?我相信我可以創建一個自定義的Android DLL來執行此修復,然後將其包裝在Xamarin綁定中。但我希望別人有一個更簡單的想法。

+0

反射可能可以解決這個問題。但無論哪種方式都不是一個好方法。 –

+1

你有辦法重現嗎?我正在使用'InputFilterLengthFilter',並且在使用'textAutoComplete'之前沒有看到這個錯誤,字典中比過濾器長度更長的單詞會被截斷...... – SushiHangover

+0

我們只能在4.4.2中重現它,和特定的Zebra設備上。但是我們重現它的方式是簡單地使用任何EditText,將一些文本放入它,打空格,放一些文本,打空格。選擇第二組字母並選擇其中一個拼寫更正。這個應用程序每次都會崩潰。 – Jared

回答

0

所以我最終創建了一個自定義Android庫,該庫有一個自定義類,它擴展了EditText並修復了兩個方法(原始問題中提到的解決方案)。

然後我把它包裝在一個Xamarin綁定中,它解決了這個問題。

我也可以確認這隻發生在運行4.4.2的Zebra TC70設備上。非常具體和模糊。