【发布时间】:2017-02-03 23:32:36
【问题描述】:
我们有一个 Xamarin Android 应用程序有时会遇到以下崩溃:
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 在包装这些方法时似乎将它们设为私有。在 EditText(或 TextView)的 Xamarin 实现中无法访问它们。
那么有人对如何在 Xamarin 中解决这个问题有任何想法吗?我相信我可以创建一个执行此修复的自定义 Android dll,然后将其包装在 Xamarin 绑定中。但我希望其他人有一个更简单的想法。
【问题讨论】:
-
反射可能会解决这个问题。但无论哪种方式都不是一个很好的解决方案。
-
你有办法重现这个吗?我正在使用
InputFilterLengthFilter并且在使用textAutoComplete之前没有看到此错误,字典中超过过滤器长度的单词会被截断... -
我们只能在 4.4.2 和特定的 Zebra 设备上重现它。但是我们重现它的方式是简单地获取任何 EditText,在其中放入一些文本,点击空格,再放入一些文本,点击空格。选择第二组字母并选择其中一个拼写更正。然后应用程序每次都会崩溃。