Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用SpannableStringBuilder使特定单词在android中可单击_Java_Android - Fatal编程技术网

Java 使用SpannableStringBuilder使特定单词在android中可单击

Java 使用SpannableStringBuilder使特定单词在android中可单击,java,android,Java,Android,我想让一些单词在给定的字符串中可以点击,比如“我必须遇到@vikash和@walker,还有@jay。(点击一次,我将打开一个拨号窗口。) 在这篇文章中,我想让所有在开头有“@”的单词都可以点击。 使用此选项,只能单击一个单词 private SpannableStringBuilder addClickablePart(String str) { SpannableStringBuilder ssb = new SpannableStringBuilder(str); int

我想让一些单词在给定的字符串中可以点击,比如“我必须遇到@vikash和@walker,还有@jay。(点击一次,我将打开一个拨号窗口。) 在这篇文章中,我想让所有在开头有“@”的单词都可以点击。 使用此选项,只能单击一个单词

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单独点击,如果这不可能,请告诉我告诉我怎么才能只点击字符串。而不是从“@”开始的整个字符串。