一个字符串上的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的方式,所以我那种即兴发挥,但在做罚款到现在!

+0

实际上根据你的代码,你将在三个空间中得到“房间里的空间[space] [space] [space]”,因为你用一个空格来调用'replace';这个额外的空间你确定你没有计算索引吗? – Jon

+0

感谢您的回复,您对空间是正确的,但我还没有到达代码实际发生的地方 - 但如果“”不起作用,我可以与空间一起生活。代码的工作方式是从来没有明确指定索引,理论上的代码根据单词的选择开始和结束的位置来计算。但我认为索引是问题所在。 – wgibbsw

你的问题是

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

  • 检查wordtobedeleted = SpecialTextView.getText().toString().substring(startSelection, endSelection);在你的代码。

startSelectionendSelection可能等于-1。

  • 在代码中检查String specpossibleWord = specialtappedtext.substring(specialstart, specialend);

specialstartspecialend是可能等于-1。

+0

感谢您的回复,我不知道当代码应该根据文本选择开始和结束的位置来计算所有内容时,索引可以如何= -1。我想知道我是否可以使用startSelection + 1和endSelection + 1等来获得我所追求的。 – wgibbsw

+0

你可以在你的代码中添加日志。显示'substring'索引。 – KeLiuyue

+0

感谢您的建议,目前有点超出我的意思,所以我会研究如何获取子字符串索引的日志。我只是不明白为什么当我从我的第一个完美的复制粘贴它时,它不工作。 – wgibbsw