【问题标题】:Android - Ellipsize & Truncate all long Urls in a TextviewAndroid - 椭圆大小和截断文本视图中的所有长网址
【发布时间】:2016-01-17 03:32:19
【问题描述】:

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

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

例如,链接http://www.getfluttr.com/flap/3rL7/now-only-if-modi-would-listen-to-opposition-party-/ 应该是这样的:

(截图来源:推特)

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

【问题讨论】:

  • 你不能使用TextView的maxLengthellipsize XML属性吗?
  • @GSala 嘿。谢谢。实际上链接不需要最终出现。它可以在 TextView 中的任意位置和任意数量。

标签: android textview ellipsis spannablestring


【解决方案1】:

以下代码将为您解决问题

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;
    }
}

那么你可以像这样简单地使用它:

 itemView.setText(LinkShortener.shortenLinks("https://example.com/really_long_url"));

您可能需要在文本视图上禁用自动链接

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

【讨论】:

  • 谢谢菲利普。绝妙的解决方案!我正在尝试使用 SpannableString。您的解决方案非常有效。
  • 这个问题是你不能再点击链接
  • @RenaudFavier 你确定吗?我没有看到这个问题
  • 好吧,在我的设备上,clics 现在重定向到“examp...”,而不是实际的 url。当我在 xml 中使用“android:autoLink="all"”时,我的意思是
  • 如果我不使用自动链接,链接不是 clicables
【解决方案2】:

我根据 Twitter 行为向@Filip Wieladek 答案添加了一些“漂亮”的更新。 提供的代码首先删除 http(s)://www. 前缀,最多提供 12 个字符 以获得更多有用信息。它也完全符合问题所需的行为。示例:

  • https://www.stackove...(20 个字符)
  • stackoverflow.com/que...(20 个不带前缀的字符)

代码

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) {

            // 1 - Remove the https:// or http:// prefix
            if(linkText.toString().toLowerCase().startsWith("https://"))
                linkText = linkText.subSequence("https://".length(), linkText.length());
            else if(linkText.toString().toLowerCase().startsWith("http://"))
                linkText = linkText.subSequence("http://".length(), linkText.length());

            // 2 - Remove the www. prefix
            if(linkText.toString().toLowerCase().startsWith("www."))
                linkText = linkText.subSequence("www.".length(), linkText.length());

            // 3 - Truncate if still longer than MAX_LINK_LENGTH
            if (linkText.length() > MAX_LINK_LENGTH) {
                linkText = linkText.subSequence(0, MAX_LINK_LENGTH) + "…";
            }

            // 4 - Replace the text preserving the spans
            builder.replace(start, end, linkText);
            builder.removeSpan(span);
            builder.setSpan(span, start, start+linkText.length(), flags);
        }
    }
    return builder;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-14
    • 2014-05-23
    • 2015-03-18
    • 2015-05-18
    • 2017-07-20
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    相关资源
    最近更新 更多