Android - Ellipsize并在Textview中截断所有长网址

sil*_*ave 1 android ellipsis textview spannablestring

在我的Android应用程序的textview中,如果URL的长度大于某个限制,我想省略所有URL(已经使用可点击范围链接)以获得省略号(或截断).

这种行为的灵感来自twitter和facebook.

例如,链接http://www.getfluttr.com/flap/3rL7/now-only-if-modi-would-listen-to-opposition-party-/它应该如下所示:

在此输入图像描述 (截图来源:推特)

我知道这必须涉及跨度.我似乎无法找到一个允许我在保持链接的同时替换文本的跨度.

小智 6

以下代码将为您解决问题

public class LinkShortener {

    public static final int MAX_LINK_LENGTH = 20;

    public static CharSequence shortenLinks(String text) {
        return shortenLinks(text, Linkify.ALL);
    }

    public static CharSequence shortenLinks(String text, int linkMask) {
        SpannableStringBuilder builder = new SpannableStringBuilder(text);
        Linkify.addLinks(builder, linkMask);
        URLSpan[] spans = builder.getSpans(0, builder.length(), URLSpan.class);
        for (URLSpan span : spans) {
            int start = builder.getSpanStart(span);
            int end = builder.getSpanEnd(span);
            int flags = builder.getSpanFlags(span);

            CharSequence linkText = builder.subSequence(start, end);
            if (linkText.length() > MAX_LINK_LENGTH) {
                linkText = linkText.subSequence(0, 20) + "…";
                builder.replace(start, end, linkText);
                builder.removeSpan(span);
                builder.setSpan(span, start, start+linkText.length(), flags);
            }
        }
        return builder;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样简单地使用它:

 itemView.setText(LinkShortener.shortenLinks("https://example.com/really_long_url"));
Run Code Online (Sandbox Code Playgroud)

您可能需要在文本视图中禁用autoLink

代码首先使用Android工具中的构建链接文本.然后它遍历所有创建URLSpans,并通过替换缩短文本.最后,我们改变跨度以确保它具有正确的界限.由于我们正在重用现有范围,因此将保留URL