【问题标题】:App crashes with IndexOutOfBoundException: setSpan ... ends beyond length 1 in performAccessibilityAction应用程序因 IndexOutOfBoundException 崩溃:setSpan ... 在 performAccessibilityAction 中超过长度 1
【发布时间】: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 显示用于在文本框中输入数据的数字小键盘。

有谁知道如何让过滤器真正做某事?

【问题讨论】:

    标签: android internals


    【解决方案1】:

    another thread here 对此有一些您可以尝试的解决方法

    看起来至少在 Issue Tracker - 这是 4 月初某人的报告,6 月,同一位记者也提到了这个特定的 (4 ... 4) 崩溃

    【讨论】:

      【解决方案2】:

      如果你的setSelection有错误,

      也许你会这样使用。

       editText.setSelection(editText.length());
      

      所以改成

          Editable editable = mFrontEditText.getText();
          Selection.setSelection(editable, editable.length());
      

      像这样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-22
        • 2012-01-25
        • 2018-07-02
        • 2018-07-12
        • 2020-05-31
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        相关资源
        最近更新 更多