java.lang.IndexOutOfBoundsException: setSpan (118 ... 119) заканчивается за пределами длины 118 - PullRequest
0 голосов
/ 02 декабря 2018

Я искал разные вопросы, но не нашел ничего конкретного в моей проблеме.Я изменяю цвет текста, выбирая цвет, и работает успешно, однако, когда я начинаю удалять свой текст редактирования после ввода цветного текста, я получаю эту ошибку.

myedittext.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            spannableString.setSpan(new ForegroundColorSpan(Color.parseColor(txtColor)), start, start+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

        }
        @Override
        public void afterTextChanged(Editable s) {
        }
    });
}

Я получаю следующую ошибку

java.lang.IndexOutOfBoundsException: setSpan (118 ... 119) ends beyond length 118
    at android.text.SpannableStringBuilder.checkRange(SpannableStringBuilder.java:1309)
    at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:680)
    at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:672)
    at com.apps.primalnotes.Fragments.EditorFragment$16.onTextChanged(EditorFragment.java:842)
    at android.widget.TextView.sendOnTextChanged(TextView.java:10611)
    at android.widget.TextView.handleTextChanged(TextView.java:10715)
    at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:14057)

Я пишу двумя цветами сейчас вот так

enter image description here

теперь, когда я сохраню это.он сохраняет только в розовом цвете и показывает мне вот так enter image description here enter image description here но теперь, когда я сохраняю его снова без каких-либо изменений, он сохраняет в цветах, которые я написал enter image description here

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Метод onTextChanged вызывается, чтобы сообщить вам, что в CharSequence s число символов count, начинающееся с start, только что заменило старый текст длиной before.

Происходит следующее: когда пользователь нажимает клавишу Backspace, start находится на верхнем пределе вашей последовательности символов, т. Е. Если раньше у вас было семь символов, start равен 6, что соответствует последнему элементу.Вы делаете start+1, что всегда является числом вне диапазона индекса.

myedittext.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if(start < s.length() - 1 || count > before){
                spannableString.setSpan(new ForegroundColorSpan(Color.parseColor(txtColor)), start, start+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }

        }
        @Override
        public void afterTextChanged(Editable s) {
        }
    });
}

Не удалось попробовать этот код, но он должен работать.Это просто, чтобы показать вам, что вы делаете неправильно и что вам следует делать.

0 голосов
/ 02 декабря 2018

Когда вы удаляете текст из конца строки, метод onTextChanged() будет вызываться со значениями, отражающими тот факт, что строка стала короче.Похоже, вы написали свой код, чтобы всегда предполагать, что длина будет больше;Вы раскрашиваете только что набранного персонажа.Но если вместо этого вы удалите символ, вы, вероятно, не захотите этого делать.

Вы можете добавить проверку, чтобы убедиться, что count больше before, это как минимум покажетэтот текст был добавлен в строку.

if (count > before) {
    spannableString.setSpan(...);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...