【发布时间】:2020-09-29 06:44:25
【问题描述】:
我使用我发布到 Google Play 的应用程序从未知来源获得了这份 ACRA 报告:
java.lang.IndexOutOfBoundsException: setSpan (4 ... 4) ends beyond length 1
at android.text.SpannableStringBuilder.checkRange(SpannableStringBuilder.java:1090)
at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:665)
at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:658)
at android.text.Selection.setSelection(Selection.java:76)
at android.text.Selection.setSelection(Selection.java:87)
at android.widget.EditText.setSelection(EditText.java:98)
at android.widget.EditText.performAccessibilityActionInternal(EditText.java:138)
at android.view.View.performAccessibilityAction(View.java:8889)
at android.view.AccessibilityInteractionController.performAccessibilityActionUiThread(AccessibilityInteractionController.java:668)
at android.view.AccessibilityInteractionController.-wrap6(AccessibilityInteractionController.java)
at android.view.AccessibilityInteractionController$PrivateHandler.handleMessage(AccessibilityInteractionController.java:1194)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5421)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
没有任何堆栈帧表示我的任何代码(都是 Android 内部代码),所以我不知道它可能是什么。这不像我的应用程序调用带有参数的东西来访问 1 个字符串的字符 4...4。所以不幸的是,回答说我正在访问超出字符串末尾的字符(或等效的数组元素)并没有多大帮助。不知何故,它似乎是 Android 内部的东西,没有我的应用程序调用任何东西,正在这样做。而且我真的不知道用户正在做什么来触发它,可能在文本输入框中做了一些时髦的字符串选择。感谢您的帮助。
应该说这是 Android SDK 23。
深入研究那个 Android 代码,EditText.java 第 138 行:
case AccessibilityNodeInfo.ACTION_SET_TEXT: {
CharSequence text = (arguments != null) ? arguments.getCharSequence(
AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE) : null;
setText(text);
// must retrieve possibly modified text
if (text != null && text.length() > 0) {
setSelection(text.length()); // 138: il puque ici
}
return true;
}
所以在第 138 行有错误的 setSelection() 调用,使用 text.length() 作为其参数来将光标设置在文本的末尾。那么如果文本的长度是 1,那么 text.length() 怎么可能是 4?那么 TextView.setText() 被称为上面几行,它在某些情况下修改文本(我还不知道),显然在这种情况下将它从 4 个字符缩短到 1 个。
事实证明这是一个 Android 错误。 https://android.googlesource.com/platform/frameworks/base/+/6dde7e7
我认为唯一能找到的就是文本过滤器是将输入类型设置为 InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL 然后尝试执行 setText (Double.toString (Double.NaN)) 但它很高兴在文本框中显示 NaN 而不会在模拟器中使用 Sdk 23 崩溃。我知道过滤器已经到位,因为 Android 显示用于在文本框中输入数据的数字小键盘。
有谁知道如何让过滤器真正做某事?
【问题讨论】: