这个问题可能与this one https://stackoverflow.com/questions/21094349/prevent-line-break-in-textview,但由于它的答案都没有真正解决问题,所以我会再问一次。
我的应用程序有一个 TextView,偶尔会显示很长的 URL。出于美观原因(并且由于 URL 不包含空格),理想的行为是在跳到下一行之前完全填充每一行,如下所示:
|http://www.domain.com/som|
|ething/otherthing/foobar/|
|helloworld |
相反,URL 在栏附近被破坏,就好像它们是空格一样。
|http://www.domain.com/ |
|something/otherthing/ |
|foobar/helloworld |
我尝试扩展 TextView 类并添加修改版本手动中断方法 (在这里找到 https://stackoverflow.com/questions/14373157/dont-wrap-text-in-android-textview-at-period-in-abbreviation)欺骗 TextView 并执行我需要的操作,调用它尺寸改变时(被覆盖)。它工作得很好,除了 TextView 位于 ListView 内部这一事实之外。当此自定义 TextView 被滚动隐藏并返回时,其内容将返回到原始的破坏行为,因为视图被重新绘制而没有尺寸改变时被召唤。
我可以通过调用来解决这个问题手动中断 inside onDraw。这始终呈现预期的行为,但性能成本很高:因为onDraw每当 ListView 滚动并且手动中断方法并不完全是“轻量级”,即使在高端四核设备上,滚动也会变得令人无法接受的滞后。
下一步是爬行文本视图源代码 https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/TextView.java,尝试找出它在何处以及如何分割文本,并希望覆盖它。这是一次彻底的失败。我(一个新手)花了一整天的时间毫无结果地查看我几乎无法理解的代码。
这让我来到这里。有人可以指出我应该覆盖什么的正确方向吗(假设这是可能的)?或者也许有更简单的方法来实现我想要的?
这是手动中断我提到的方法。由于使用获取宽度(),只有在测量视图后调用它才有效。
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();
}
对于所有愿意阅读本文的人,感谢您抽出时间。