ClickableSpan для строки не текст

Хорошо, у меня есть ClickableSpan (для TextView с именем SpecialTextView), который работает отлично, он содержит строку текста (называемый specialtappedtext). Когда другой ClickableSpan в другом TextView (называемый BottomTextView) долго щелкается, он добавляет кликаемое слово в SpecialTextView следующим образом:

specialtappedtext = BottomTextView.getText().toString().substring(startSelection, endSelection);
SpecialTextView.append(" " + specialtappedtext);

В результате SpecialTextView отображает любые слова, которые нажимает пользователь. Пока все хорошо, но я позволяю пользователю долго щелкать слово в SpecialTextView, чтобы затем удалить его. Я получаю строку (называемую wordtobedeleted) из того, что пользователь нажимает в SpecialTextView, а затем строку (называемую fullspecialtext), которая представляет собой полную строку текста в том виде, в каком она появляется в SpecialTextView. Затем я заменяю любой экземпляр wordtobedeleted, который появляется в fullspecialtext, и отображаю результат обратно в SpecialTextView следующим образом:

wordtobedeleted = SpecialTextView.getText().toString().substring(startSelection, endSelection);
resultspecialtext = fullspecialtext.replace(wordtobedeleted, " ");
SpecialTextView.setText(" " + resultspecialtext);

Поэтому, если пользователь нажимает на слова "Бандит в гостиной", как показано в BottomTextView, тогда SpecialTextView будет отображать их в том же порядке. Нажатие любого из этих слов в SpecialTextView должно удалить их, поэтому, если я коснусь слов "есть", "и" и "живой", SpecialTextView отобразит "Бандит в комнате", но вместо этого я получаю сбой. Кажется, что я не могу получить подстроку из текстового представления, которое содержит строку, если я читаю это правильно, как когда я закомментирую код, то часть, которая вызывает сбой, - это то, где я получаю слово String, удаленное из SpecialTextView.

ClickableSpan, извините за некоторые длинные имена, которые помогают мне сразу же отслеживать, что к чему, потому что я манипулирую другим ClickableSpan с почти идентичными именами и т. Д. -

 SpecialTextView.setMovementMethod(LinkMovementMethod.getInstance());
 SpecialTextView.setText(specialtappedtext, TextView.BufferType.SPANNABLE);
 Spannable specialspans = (Spannable) SpecialTextView.getText();
 BreakIterator specialiterator = BreakIterator.getWordInstance(Locale.UK);
 specialiterator.setText(specialtappedtext);
 int specialstart = specialiterator.first();
 for (int specialend = specialiterator.next(); specialend != BreakIterator.DONE; specialstart = specialend, specialend = specialiterator
            .next()) {
     String specpossibleWord = specialtappedtext.substring(specialstart, specialend);
     if (Character.isLetterOrDigit(specpossibleWord.charAt(0))) {
            ClickableSpan specialclickSpan = getSpecialClickableSpan(specpossibleWord);
         specialspans.setSpan(specialclickSpan, specialstart, specialend,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
     }
 }

Помогает это или нет, но вот в журнале ошибок -

 Process: com.example.warrenanna.game003, PID: 18321
                                                                            java.lang.StringIndexOutOfBoundsException: length=30; index=-1
                                                                                at java.lang.String.substring(String.java:1926)
                                                                                at com.example.warrenanna.game003.MainActivity$2.onLongClick(MainActivity.java:133)
                                                                                at android.view.View.performLongClickInternal(View.java:5762)
                                                                                at android.view.View.performLongClick(View.java:5720)
                                                                                at android.widget.TextView.performLongClick(TextView.java:9427)
                                                                                at android.view.View.performLongClick(View.java:5738)
                                                                                at android.view.View$CheckForLongPress.run(View.java:22450)
                                                                                at android.os.Handler.handleCallback(Handler.java:751)
                                                                                at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                at android.os.Looper.loop(Looper.java:241)
                                                                                at android.app.ActivityThread.main(ActivityThread.java:6281)
                                                                                at java.lang.reflect.Method.invoke(Native Method)
                                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

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

1 ответ

Решение

ваша проблема

java.lang.StringIndexOutOfBoundsException: length=30; index=-1

  • Проверьте wordtobedeleted = SpecialTextView.getText().toString().substring(startSelection, endSelection); в вашем коде.

startSelection а также endSelection возможны равными -1 .

  • Проверьте String specpossibleWord = specialtappedtext.substring(specialstart, specialend); в вашем коде.

specialstart а также specialend возможны равными -1 .

Другие вопросы по тегам