4

默认情况下,如果行长于视图,Android EditText 将换行,如下所示:

Thisisalineanditisveryverylongs (end of view)
othisisanotherline

或者如果该行包含标点符号,如下所示:

Thisisalineanditsnotsolong;     (several characters from the end of view)
butthisisanotherline

作为我工作的要求,只有当行长于视图时,文本才需要换行,如下所示:

Thisisalineanditsnotsolong;andt (end of view)
hisisanotherline

一定有办法实现这一点,对吗?到目前为止,我还没有找到这样做的方法。

4

3 回答 3

4

TextView(和 EditText)打破文本的方式是通过内部对 BoringLayout 的私有函数调用。因此,最好的方法是子类化 EditText 并重写这些函数。但这不会是一项微不足道的任务。

因此,在TextView 类中创建了不同的文本样式类。我们看的是DynamicLayout。在这个类中,我们到达了类StaticLayout的引用(在一个名为 reflowed 的变量中)。在此类的构造函数中,您将找到文本换行算法:

/*
* From the Unicode Line Breaking Algorithm:
* (at least approximately)
*  
* .,:; are class IS: breakpoints
*      except when adjacent to digits
* /    is class SY: a breakpoint
*      except when followed by a digit.
* -    is class HY: a breakpoint
*      except when followed by a digit.
*
* Ideographs are class ID: breakpoints when adjacent,
* except for NS (non-starters), which can be broken
* after but not before.
*/

if (c == ' ' || c == '\t' ||
((c == '.'  || c == ',' || c == ':' || c == ';') &&
(j - 1 < here || !Character.isDigit(chs[j - 1 - start])) &&
(j + 1 >= next || !Character.isDigit(chs[j + 1 - start]))) ||
((c == '/' || c == '-') &&
(j + 1 >= next || !Character.isDigit(chs[j + 1 - start]))) ||
(c >= FIRST_CJK && isIdeographic(c, true) &&
j + 1 < next && isIdeographic(chs[j + 1 - start], false))) {
okwidth = w;
ok = j + 1;

这是所有包装的地方。因此,您需要对 StaticLayout、DynamicLayout、TextView 和最后的 EditText 进行子类化处理,我敢肯定,这将是一场噩梦 :( 我什至不确定所有流程是如何进行的。如果您愿意,请先查看 TextView并检查 getLinesCount 调用 - 这将是起点。

于 2011-05-26T07:48:16.607 回答
3

Android中的这种换行算法真的很糟糕,它甚至在逻辑上都不正确——逗号不能是一行的最后一个字符。它只会产生不必要的换行符,从而导致极其奇怪的文本布局。

于 2011-09-27T14:59:47.300 回答
1

嗨,这是我首先从另一个人那里得到的一种方法,然后进行一些更改,它确实对我有用,您可以尝试一下。

//half ASCII transfer to full ASCII
public static String ToSBC(String input) { 
    char[] c = input.toCharArray(); 
    for (int i = 0; i< c.length; i++) { 
    if (c[i] == 32) { 
    c[i] = (char) 12288; 
    continue; 
    } 
    if (c[i]<=47 && c[i]>32 ) 
    c[i] = (char) (c[i] + 65248); 
    } 
    return new String(c); 
    }
}

这里是。我把一些特殊字符从半角改成全角,比如“、”、“.”,效果还不错。你可以试试。

于 2013-01-30T16:39:47.300 回答