防止Android TextView破坏链接

时间:2014-05-13 02:44:46

标签: android textview word-wrap

这个问题可能与this one相同,但由于它的答案都没有真正解决问题,我会再问一次。

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

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

相反,会在URL附近破坏URL,就好像它们是空格一样。

|http://www.domain.com/   |
|something/otherthing/    |
|foobar/helloworld        |

我尝试扩展TextView类并添加 breakManually 方法(found here)的修改版本来欺骗TextView并执行我需要的操作,调用它在 onSizeChanged (被覆盖)上。除了TextView在ListView中之外,它工作正常。当滚动隐藏此自定义TextView并将其恢复时,由于在没有调用 onSizeChanged 的情况下重新绘制视图,其内容将返回到原始中断行为。

我可以通过在 onDraw 中调用 breakManually 来解决此问题。这会始终呈现预期的行为,但性能成本很高:因为每当滚动ListView并且 breakManually 时,都会调用 onDraw em> 方法并不完全“轻量级”,即使在高端四核设备上,滚动也会出现难以接受的延迟。

下一步是浏览TextView source code,试图找出文本分割的位置和方式,并希望覆盖它。这完全失败了。我(一个新手)花了一整天的时间毫无结果地看着我大多无法理解的代码。

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

这是我提到的 breakManually 方法。由于使用了 getWidth() ,它仅在测量视图后调用时才有效。

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

对于那些困扰阅读此事的人,谢谢你的时间。

1 个答案:

答案 0 :(得分:0)

如果您不使用等宽字体,则在某些情况下甚至无法很好地对齐它。由于URL中没有空格,因此类似Justify的对齐方式不太可能解决问题。我建议您为该特定TextView使用等宽字体。然后,确定每行的固定字符数,并在要输入的多个字符后用"\n"断开字符串。

这不是回答您的问题,但我想这是最流畅的方法。