gpt4 book ai didi

android - 防止 Android 的 TextView 断开链接

转载 作者:行者123 更新时间:2023-12-03 15:01:46 24 4
gpt4 key购买 nike

这个问题大概和 this one 一样,但由于它的答案都没有真正解决问题,我会再问一次。

我的应用有一个 TextView,它偶尔会显示很长的 URL。出于美学原因(并且由于 URL 不包含空格),理想的行为是在跳到下一行之前完全填满每一行,如下所示:

|http://www.domain.com/som|
|ething/otherthing/foobar/|
|helloworld |

相反,URL 在条附近被破坏,就好像它们是空格一样。
|http://www.domain.com/   |
|something/otherthing/ |
|foobar/helloworld |

我尝试扩展 TextView 类并添加 的修改版本手动中断 方法( found here )欺骗 TextView 并做我需要的,在 上调用它onSizeChanged (被覆盖)。它工作正常,除了 TextView 在 ListView 内。当此自定义 TextView 被滚动隐藏并返回时,它的内容会回到原来的破坏行为,因为 View 在没有 的情况下被重新绘制。 onSizeChanged 被调用。

我可以通过调用 来解决这个问题。手动中断 里面 绘制 .这始终呈现预期的行为,但性能成本很高:因为 绘制 每当滚动 ListView 并且 时调用手动中断 方法并不完全“轻量级”,滚动变得无法接受,即使在高端四核设备上也是如此。

下一步是爬过 TextView source code ,试图弄清楚它在哪里以及如何分割文本,并希望覆盖它。这是一个彻底的失败。我(一个新手)花了一整天毫无结果地看着我几乎无法理解的代码。

这把我带到了这里。有人可以为我指出我应该覆盖的正确方向(假设它是可能的)吗?或者也许有一种更简单的方法可以实现我想要的?

这是 手动中断 我提到的方法。由于使用 获取宽度() ,它仅在测量 View 后调用时才有效。
private CharSequence breakManually (CharSequence text) {
int width = getWidth() - getPaddingLeft() - getPaddingRight();
// Can't break with a width of 0.
if (width == 0) return text;
Editable editable = new SpannableStringBuilder(text);
//creates an array with the width of each character
float[] widths = new float[editable.length()];
Paint p = getPaint();
p.getTextWidths(editable.toString(), widths);
float currentWidth = 0.0f;
int position = 0;
int insertCount = 0;
int initialLength = editable.length();
while (position < initialLength) {
currentWidth += widths[position];
char curChar = editable.charAt(position + insertCount);
if (curChar == '\n') {
currentWidth = 0.0f;
} else if (currentWidth > width) {
editable.insert(position + insertCount , "\n");
insertCount++;
currentWidth = widths[position];
}
position++;
}
return editable.toString();
}

感谢所有阅读本文的人,感谢您的宝贵时间。

最佳答案

如果您不使用等宽字体,那么在某些情况下甚至无法很好地对齐它。由于 URL 中没有空格,因此类似 Justify 的对齐方式不太可能解决问题。我建议您为特定的 TextView 使用等宽字体。然后,确定每行的固定字符数,并用 "\n" 分隔要显示的字符串在那么多字符之后。
这没有回答你的问题,但我猜这是最顺利的方式。

关于android - 防止 Android 的 TextView 断开链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23622005/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com