Java 使用SpannableStringBuilder使特定单词在android中可单击
我想让一些单词在给定的字符串中可以点击,比如“我必须遇到@vikash和@walker,还有@jay。(点击一次,我将打开一个拨号窗口。) 在这篇文章中,我想让所有在开头有“@”的单词都可以点击。 使用此选项,只能单击一个单词Java 使用SpannableStringBuilder使特定单词在android中可单击,java,android,Java,Android,我想让一些单词在给定的字符串中可以点击,比如“我必须遇到@vikash和@walker,还有@jay。(点击一次,我将打开一个拨号窗口。) 在这篇文章中,我想让所有在开头有“@”的单词都可以点击。 使用此选项,只能单击一个单词 private SpannableStringBuilder addClickablePart(String str) { SpannableStringBuilder ssb = new SpannableStringBuilder(str); int
private SpannableStringBuilder addClickablePart(String str) {
SpannableStringBuilder ssb = new SpannableStringBuilder(str);
int idx1 = desc.indexOf("@");
int idx2 = 0;
while (idx1 != -1) {
idx2 = str.indexOf(" ", idx1) + 1;
final String clickString = str.substring(idx1, idx2);
ssb.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(ViewNote.this, clickString,
Toast.LENGTH_SHORT).show();
}
}, idx1, idx2, 0);
idx1 = str.indexOf("[", idx2);
}
return ssb;
}
您应该按照说明为
文本视图创建自定义链接规则。在您的情况下,您需要正则表达式,它将查找所有以@
字符(正则表达式)开头的单词。如@Veaceslav Gaidarji所说,对于@words,请尝试使用
请尝试以下代码:
private SpannableString addClickablePart(String str) {
SpannableString ss = new SpannableString(str);
Pattern pattern = Pattern.compile("[@]\\w*");
Pattern matcher = pattern.matcher(str);
while (matcher.find()) {
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View textView) {
// do toasting
}
};
ss.setSpan(clickableSpan, matcher.start, matcher.end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return ss;
}
---编辑---
此代码将使用正则表达式模式([@]\w*)搜索所有@字符,然后向其添加可单击的范围。
我们使用SpannableString而不是SpannableStringBuilder,因为我们不需要在这里构建SpannableString。您有多少个span?应用程序内用户可以保存许多@contacts。idx1=str.indexOf(“[”,idx2);
应该是idx1=str.indexOf(“@”,idx2)
StringIndexOutOfBoundsException:@BlackbeltalIndex2可能是负数。在你的例子中,你有也有@jay。
idx1
是@
的索引,但是从该索引中你没有空的空格,idx2应该是负数。你能描述一下我的情况吗?拜托。我只是个新手。我不知道应该用哪个字符串在textview上追加?请添加说明Juan.Bravo!!效果很好。感谢您在我点击@abc的任何地方都能工作。如果我需要单独点击怎么办。因为我必须在点击联系人时进行拨号活动。所以我必须处理单独点击。如何为每个@abc单独点击,如果这不可能,请告诉我告诉我怎么才能只点击字符串。而不是从“@”开始的整个字符串。