【问题标题】:Internal Android Crash in Xamarin around SetSpan围绕 SetSpan 的 Xamarin 内部 Android 崩溃
【发布时间】: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,在其中放入一些文本,点击空格,再放入一些文本,点击空格。选择第二组字母并选择其中一个拼写更正。然后应用程序每次都会崩溃。

标签: xamarin xamarin.android


【解决方案1】:

所以我最终创建了一个自定义 Android 库,该库具有一个扩展 EditText 并修复这两种方法的自定义类(原始问题中提到的解决方案)。

然后我将它包装在 Xamarin 绑定中,它解决了问题。

我还可以确认,这只发生在运行 4.4.2 的 Zebra TC70 设备上。非常具体和晦涩。

【讨论】:

  • 嗨@Jared。我在 Zebra TC25 上遇到了同样的问题。你能发布你的解决方案吗?
  • 您是否在 Android 或 Xamarin Android 中遇到此问题?如果只是普通的 Android,解决方案非常简单。请参阅此处:issuetracker.google.com/issues/36944935#comment5 如果您使用的是 Xamarin Android,则需要在 Android 库中实现该解决方案,然后将其包装在 Xamarin 自定义绑定中。如果您不熟悉这些概念中的任何一个,则需要进行一些研究。 docs.microsoft.com/en-us/xamarin/android/platform/…
猜你喜欢
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多