字符串上的 ClickableSpan 而不是文本
A ClickableSpan on a String not text
好的,我有一个运行良好的 ClickableSpan(在名为 SpecialTextView 的 TextView 上),它包含一个文本字符串(称为 specialtappedtext)。当另一个 TextView(称为 BottomTextView)上的另一个 ClickableSpan 被长按时,它会像这样将被点击的词添加到 SpecialTextView -
specialtappedtext = BottomTextView.getText().toString().substring(startSelection, endSelection);
SpecialTextView.append(" " + specialtappedtext);
结果是 SpecialTextView 显示用户点击的任何单词。到目前为止一切都很好,但我随后允许用户在 SpecialTextView 中长按一个词,然后将其删除。我从用户在 SpecialTextView 中点击的内容中得到一个字符串(称为 wordtobedeleted),然后是一个字符串(称为 fullspecialtext),它是出现在 SpecialTextView 中的整行文本。然后,我替换出现在 fullspecialtext 中的任何 wordtobedeleted 实例,并像这样在 SpecialTextView 中显示结果 -
wordtobedeleted = SpecialTextView.getText().toString().substring(startSelection, endSelection);
resultspecialtext = fullspecialtext.replace(wordtobedeleted, " ");
SpecialTextView.setText(" " + resultspecialtext);
因此,如果用户点击 BottomTextView 中显示的单词 "Bandit is in the living room",则 SpecialTextView 将按照点击的顺序显示它们。在 SpecialTextView 中按这些词中的任何一个都应该删除它们,所以如果我点击词 "is"、"the" 和 "living",SpecialTextView 将显示 "Bandit in room" 但我却崩溃了.似乎我无法从包含字符串的文本视图中获取子字符串,如果我正确阅读此内容,因为当我注释掉代码时,导致崩溃的部分是我从 SpecialTextView 中获取 String wordtobedeleted 的地方。
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.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,所以我有点即兴发挥,但直到现在都还不错!
you problem is
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。
好的,我有一个运行良好的 ClickableSpan(在名为 SpecialTextView 的 TextView 上),它包含一个文本字符串(称为 specialtappedtext)。当另一个 TextView(称为 BottomTextView)上的另一个 ClickableSpan 被长按时,它会像这样将被点击的词添加到 SpecialTextView -
specialtappedtext = BottomTextView.getText().toString().substring(startSelection, endSelection);
SpecialTextView.append(" " + specialtappedtext);
结果是 SpecialTextView 显示用户点击的任何单词。到目前为止一切都很好,但我随后允许用户在 SpecialTextView 中长按一个词,然后将其删除。我从用户在 SpecialTextView 中点击的内容中得到一个字符串(称为 wordtobedeleted),然后是一个字符串(称为 fullspecialtext),它是出现在 SpecialTextView 中的整行文本。然后,我替换出现在 fullspecialtext 中的任何 wordtobedeleted 实例,并像这样在 SpecialTextView 中显示结果 -
wordtobedeleted = SpecialTextView.getText().toString().substring(startSelection, endSelection);
resultspecialtext = fullspecialtext.replace(wordtobedeleted, " ");
SpecialTextView.setText(" " + resultspecialtext);
因此,如果用户点击 BottomTextView 中显示的单词 "Bandit is in the living room",则 SpecialTextView 将按照点击的顺序显示它们。在 SpecialTextView 中按这些词中的任何一个都应该删除它们,所以如果我点击词 "is"、"the" 和 "living",SpecialTextView 将显示 "Bandit in room" 但我却崩溃了.似乎我无法从包含字符串的文本视图中获取子字符串,如果我正确阅读此内容,因为当我注释掉代码时,导致崩溃的部分是我从 SpecialTextView 中获取 String wordtobedeleted 的地方。
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.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,所以我有点即兴发挥,但直到现在都还不错!
you problem is
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。