一个字符串上的ClickableSpan不是文本
好吧我有一个ClickableSpan(在一个名为SpecialTextView的TextView上)完美地工作,它包含一个文本字符串(称为specialTablePedtext)。当在不同的TextView另一ClickableSpan(称为BottomTextView)被longclicked它addsthe点击字SpecialTextView这样的 -一个字符串上的ClickableSpan不是文本
specialtappedtext = BottomTextView.getText().toString().substring(startSelection, endSelection);
SpecialTextView.append(" " + specialtappedtext);
结果是SpecialTextView显示任何单词的用户点击。目前为止都很好,但是我允许用户在SpecialTextView中单击一个单词,然后将其删除。我从SpecialTextView中得到一个String(称为wordtobedeleted),然后是一个字符串(称为fullspecialtext),它是SpecialTextView中出现的全部文本行。然后我替换出现在fullspecialtext的wordtobedeleted任何实例,并将结果显示回SpecialTextView这样的 -
wordtobedeleted = SpecialTextView.getText().toString().substring(startSelection, endSelection);
resultspecialtext = fullspecialtext.replace(wordtobedeleted, " ");
SpecialTextView.setText(" " + resultspecialtext);
所以,如果用户点击的话“强盗是在客厅”中显示BottomTextView然后SpecialTextView会按顺序显示它们。在SpecialTextView中按任何这些词应该将它们删除,所以如果我点击“is”,“the”和“living”这两个词,SpecialTextView将显示“Bandit in room”,但是我会发生崩溃。看起来,我无法从包含字符串的textview中获取子字符串,如果我正在阅读这个权限,那么当我注释掉代码时,导致崩溃的部分就是我从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的方式,所以我那种即兴发挥,但在做罚款到现在!
你的问题是
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。
实际上根据你的代码,你将在三个空间中得到“房间里的空间[space] [space] [space]”,因为你用一个空格来调用'replace';这个额外的空间你确定你没有计算索引吗? – Jon
感谢您的回复,您对空间是正确的,但我还没有到达代码实际发生的地方 - 但如果“”不起作用,我可以与空间一起生活。代码的工作方式是从来没有明确指定索引,理论上的代码根据单词的选择开始和结束的位置来计算。但我认为索引是问题所在。 – wgibbsw