Android - 省略并截断文本视图中的所有长网址
Android - Ellipsize & Truncate all long Urls in a Textview
如果URL 的长度大于某个限制。
此行为的灵感来自 Twitter 和 Facebook。
例如,link http://www.getfluttr.com/flap/3rL7/now-only-if-modi-would-listen-to-opposition-party-/ 它应该看起来像这样:
(截图来源:推特)
我知道这必须涉及跨度。我似乎无法找到允许我在保持 link.
的同时替换文本的跨度
以下代码将为您解决问题
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,并通过替换缩短文本。最后,我们更改跨度以确保它具有正确的界限。由于我们正在重用现有跨度,因此 URL 将被保留
我根据 Twitter 行为对@Filip Wieladek 的回答添加了一些 "pretty" 更新。
提供的代码首先删除 http(s)://www. 前缀,提供最多 12 个字符 以获得更多有用信息。它也完全符合问题所需的行为。示例:
- https://www.stackove...(20 个字符)
- Whosebug。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;
}
此行为的灵感来自 Twitter 和 Facebook。
例如,link http://www.getfluttr.com/flap/3rL7/now-only-if-modi-would-listen-to-opposition-party-/ 它应该看起来像这样:
我知道这必须涉及跨度。我似乎无法找到允许我在保持 link.
的同时替换文本的跨度以下代码将为您解决问题
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,并通过替换缩短文本。最后,我们更改跨度以确保它具有正确的界限。由于我们正在重用现有跨度,因此 URL 将被保留
我根据 Twitter 行为对@Filip Wieladek 的回答添加了一些 "pretty" 更新。 提供的代码首先删除 http(s)://www. 前缀,提供最多 12 个字符 以获得更多有用信息。它也完全符合问题所需的行为。示例:
- https://www.stackove...(20 个字符)
- Whosebug。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;
}