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

时间:2015-04-07 08:22:55

标签: java android

我想在给定字符串中点击一些单词,例如“我必须遇见@vikash和@walker以及@jay。”onClick我将打开一个拨号窗口。) 在这里我想让所有单词在开始时都有“@”。 使用它只有一个单词是可点击的。

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;

}

2 个答案:

答案 0 :(得分:0)

您应按照here所述为TextView创建自定义链接规则。在您的情况下,您需要正则表达式,它会找到以@字符(sample正则表达式)开头的所有单词。

答案 1 :(得分:0)

正如@Veaceslav Gaidarji所说,@ words尝试使用regex

试试这段代码:

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 *)搜索所有@character,然后为它们添加可点击范围。 我们使用SpannableString而不是SpannableStringBuilder,因为我们不需要在这里构建spannableString。