2

尝试做一些相当简单的事情。

采取这样的文字

用户名:这是我正在做的评论

它位于单个 TextView 中。我想让用户名成为一个链接。我决定最简单的方法是将用户名用“$@”之类的东西括起来,这样它就变成了

"$@User Name:$@ 这是我正在做的评论

这样我就可以使用下面的正则表达式

Pattern userName = Pattern.compile(".*\\$@(.+)\\$@.*");

使用 Linkify 并使其成为链接。但是,显然我需要删除分隔符,所以下面是代码

title.setText(titleText);
Linkify.TransformFilter transformer = new Linkify.TransformFilter() {

    @Override
    public String transformUrl(Matcher match, String url) {
       return match.group(1);
    }
};
Linkify.addLinks(title, userName, "content://user=", null,     transformer);

然而,由于某种原因,整个文本变成了一个巨大的链接,并且文本根本没有被转换。

4

3 回答 3

1

事实证明,这确实很容易。我最终没有使用疯狂的“$@”来分隔用户名,而是坚持使用

用户名:这是我正在做的评论

所以我最终使用了以下模式

Pattern userName = Pattern.compile("(.+:)");

很简单,代码就变成了

title.setText(titleText);
Linkify.addLinks(title, GlobalUtil.userName, "user://" + userId + "/");

感谢 nil 的原始建议。我确实匹配了整个字符串,而不仅仅是链接的用户名。

于 2011-06-22T18:47:12.193 回答
0

我最好的猜测是你正在使用的正则表达式是问题所在,你告诉它基本上挑选出整个字符串,如果它匹配,包括你正在寻找的之前和之后的所有内容。因此,TransformFilter可能正在传递整个匹配的字符串。 transformUrl据我所知,希望您返回 URL,因此整个字符串都链接到第一个匹配组。

因此,考虑到这一点,将正则表达式更改为"\\$@(.+?)\\$@"?在组中添加一个以使匹配不贪婪)可能符合您的最大利益,以避免匹配整个字符串而只是挑选出来您想要 URL 化的位(因为缺少更好的术语,加上 -ize 到单词听起来很酷)。

于 2011-06-20T23:38:18.560 回答
0

为什么不把定界符放在pattern里面来改变呢?

Pattern userName = Pattern.compile(".*(\\$@.+\\$@).*");

然后更改转换过滤器以在更改为 URL 时删除开始和结束模式...

于 2011-06-20T23:54:39.083 回答