2017-02-03 2 views
0

Wir haben einen Xamarin Android-App, die manchmal ist den folgenden Absturz erlebt:Interner Android Absturz in Xamarin um 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) 

Nach einigen Untersuchungen haben wir festgestellt, was diesen Absturz verursacht, und wie andere (mit Klar Android, nicht Xamarin, hat es gelöst):

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

Die Lösung EditText zu erweitern und außer Kraft setzt zwei geschützte Methoden:

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)); 
} 

Großartig, eine einfache Lösung. Außer natürlich, dass Xamarin diese Methoden beim Umhüllen privat zu machen scheint. Sie sind in der Xamarin-Implementierung von EditText (oder TextView) nicht verfügbar.

Hat also jemand irgendwelche Ideen, wie Sie dieses Problem in Xamarin lösen können? Ich glaube, ich kann eine benutzerdefinierte Android-DLL erstellen, die diesen Fix ausführt und dann in Xamarin-Bindungen einwickelt. Aber ich hoffe, dass jemand anderes eine einfachere Idee hat.

+0

Reflexion könnte das wahrscheinlich lösen. Aber so oder so keine großartige Lösung. –

+1

Haben Sie eine Möglichkeit, dies zu reproduzieren? Ich benutze 'InputFilterLengthFilter' und habe diesen Fehler nicht gesehen, bevor' textAutoComplete' verwendet wurde, die Wörter aus dem Wörterbuch, die länger als die Filterlänge sind, werden abgeschnitten ... – SushiHangover

+0

Wir konnten es nur unter 4.4.2 reproduzieren, und auf einem bestimmten Zebra-Gerät. Aber die Art und Weise, wie wir es reproduzieren, besteht darin, einfach einen EditText zu nehmen, etwas Text hinein zu fügen, Leerzeichen zu drücken, etwas mehr Text einzugeben und Leerzeichen zu drücken. Wählen Sie den zweiten Satz von Buchstaben und wählen Sie eine der Rechtschreibkorrekturen. Die App wird dann jedes Mal abstürzen. – Jared

Antwort

0

Also habe ich am Ende erstellt eine benutzerdefinierte Android-Bibliothek, die eine benutzerdefinierte Klasse, die EditText erweitert und behebt die beiden Methoden (die Lösung in der ursprünglichen Frage erwähnt).

Dann habe ich dies in eine Xamarin-Bindung gewickelt und es das Problem gelöst.

Ich kann auch bestätigen, dass dies nur auf Zebra TC70-Geräten mit 4.4.2 passiert. Sehr spezifisch und unklar.