Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
防止Android';从断开链接中删除文本视图_Android_Textview_Word Wrap - Fatal编程技术网

防止Android';从断开链接中删除文本视图

防止Android';从断开链接中删除文本视图,android,textview,word-wrap,Android,Textview,Word Wrap,这个问题可能与相同,但由于没有一个答案能真正解决问题,我将再次提问 我的应用程序有一个文本视图,偶尔会显示很长的URL。出于美观的原因(并且由于URL不包含空格),理想的行为是在跳到下一行之前完全填充每一行,类似这样: |http://www.domain.com/som| |ething/otherthing/foobar/| |helloworld | 相反,发生的情况是,URL在条附近被打断,就好像它们是空格一样 |http://www.domain.com/

这个问题可能与相同,但由于没有一个答案能真正解决问题,我将再次提问

我的应用程序有一个文本视图,偶尔会显示很长的URL。出于美观的原因(并且由于URL不包含空格),理想的行为是在跳到下一行之前完全填充每一行,类似这样:

|http://www.domain.com/som|
|ething/otherthing/foobar/|
|helloworld               |
相反,发生的情况是,URL在条附近被打断,就好像它们是空格一样

|http://www.domain.com/   |
|something/otherthing/    |
|foobar/helloworld        |
我尝试扩展TextView类并添加一个修改版本的手动断开方法(),以欺骗TextView并执行我需要的操作,在onSizeChanged(重写)上调用它。它工作正常,除了TextView位于ListView内部这一事实。当此自定义文本视图被滚动隐藏并返回时,其内容会返回到原始的中断行为,因为视图会在未调用onSizeChanged的情况下重新绘制

我可以通过调用breakManuallyinsideonDraw来解决这个问题。这在任何时候都会表现出预期的行为,但性能代价很高:因为每当滚动ListView时都会调用onDraw,而且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();
    }
private CharSequence breakManually(CharSequence文本){
int width=getWidth()-getPaddingLeft()-getPaddingRight();
//宽度为0时无法打断。
如果(宽度==0)返回文本;
可编辑=新的SpannableStringBuilder(文本);
//创建具有每个字符宽度的数组
float[]宽度=新的float[editable.length()];
Paint p=getPaint();
p、 getTextWidths(可编辑的.toString(),宽度);
浮动电流宽度=0.0f;
int位置=0;
int insertCount=0;
int initialLength=可编辑的.length();
while(位置<初始长度){
currentWidth+=宽度[位置];
char curChar=可编辑的.charAt(位置+插入计数);
如果(curChar=='\n'){
电流宽度=0.0f;
}否则如果(当前宽度>宽度){
可编辑。插入(位置+插入计数,“\n”);
insertCount++;
currentWidth=宽度[位置];
}
位置++;
}
返回可编辑的.toString();
}

感谢阅读本文的每一位读者。如果您没有使用单空格字体,那么在某些情况下甚至无法很好地对齐它。因为URL中没有空格,所以类似于Justify的对齐方式不太可能解决问题。我建议您对特定的文本视图使用单空格字体。然后,确定每行的固定字符数,并将字符串断开以在这些字符后显示“\n”

这不是回答你的问题,但我想这是可能的最顺利的方式。

与其结束这个问题(这是一个更好的问题),我建议,如果有答案,记得结束建议的问题(),它被接受的答案本质上就是我在第3段中描述的。如果TextView不移动,但在ListView中出现一次错误行为,则可以正常工作。我的意图是覆盖负责分割文本的任何方法,使自定义TextView从一开始就按预期呈现,而不是在绘制视图后更改其内容。