java.lang.IndexOutOfBoundsException:setSpan(N ... N)结束超过长度10500

时间:2018-01-23 12:24:07

标签: java android android-edittext

当我致电devise_for :admins mount RailsAdmin::Engine => '/admin', as: 'rails_admin' scope :api do scope :v1 do devise_for :users, controllers: { registrations: 'users/registrations', confirmations: 'users/confirmations', sessions: 'users/sessions', passwords: 'users/passwords' } get 'confirm_user_email', to: 'user_emails#confirm_email', as: :confirm_user_email get 'forgot_password', to: 'landing_page#forgot_password' post 'send_invitation', to: 'users#send_invitation', as: :send_invitation end end unless Rails.env.production? mount LetterOpenerWeb::Engine, at: '/letter_opener' end require 'sidekiq/web' mount Sidekiq::Web => '/sidekiq' get "*path" => "home#index" mount ActionCable.server => '/cable'

时,我收到此异常
EditText.setSelection()

N可以是任何数字。例如,如果我呼叫java.lang.IndexOutOfBoundsException: setSpan (N ... N) ends beyond length 10500 N将是10568.但setSelection(10476,10568)是常数。

10500

java.lang.IndexOutOfBoundsException: setSpan (10568 ... 10568) ends beyond length 10500 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:78) at android.widget.EditText.setSelection(EditText.java:91) ... 是否存在导致此问题的限制?

在我做选择之前,我加载一个文本文件,其中包含肯定超过10500个字符,因为它包含ca. 12000行。然后我调用EditText将文件内容放入字段中。 EditText.setText()没有任何问题。 首先我认为文件内容有问题,但我加载了另一个文件,当选择发生时,我得到了相同的异常,它包含EditText.setText()

2 个答案:

答案 0 :(得分:2)

这是代码失败的android.text.SpannableStringBuilder的实际方法。

private void checkRange(final String operation, int start, int end) {
    if (end < start) {
        throw new IndexOutOfBoundsException(operation + " " +
                region(start, end) + " has end before start");
    }

    int len = length();

    if (start > len || end > len) {
        throw new IndexOutOfBoundsException(operation + " " +
                region(start, end) + " ends beyond length " + len);
    }

    if (start < 0 || end < 0) {
        throw new IndexOutOfBoundsException(operation + " " +
                region(start, end) + " starts before 0");
    }
}

看起来你的开始/结束大于EditText中的长度(由length()计算)。可能是截断的情况。

EditText可以容纳的字符数不受Android操作系统的限制,但可能来自设备。请参阅Max 9000 characters in Android TextView?以及https://groups.google.com/forum/#!topic/android-developers/JVAm8vBaIQg

答案 1 :(得分:1)

使用AutoCompleteTextView时出现这样的问题。问题是自动完成窗口会延迟打开。如果在此延迟期间删除了文本,那么当您尝试打开窗口时,弹出窗口将尝试使用已删除的文本。避免这种情况的唯一方法是取消打开此窗口。这可以通过从该视图的Handler中删除所有操作来完成。 autoCompleteTextView.getHandler().removeCallbacksAndMessages(null);