默认情况下,如果行比视图长,Android EditText会断行,如下所示:
Thisisalineanditisveryverylongs (end of view)
othisisanotherline
或者该行包含标点字符,如下所示:
Thisisalineanditsnotsolong; (several characters from the end of view)
butthisisanotherline
作为我工作的一项要求,只有当行长于视图时,文本才能断行,如下所示:
Thisisalineanditsnotsolong;andt (end of view)
hisisanotherline
必须有办法实现这一目标,对吗?到目前为止,我还没有找到这样做。
答案 0 :(得分:4)
TextView(和EditText)打破文本的方式是通过内部对BoringLayout的私有函数调用。因此,最好的方法是升级EditText并重写这些函数。但这不是一项微不足道的任务。
因此,在TextView class中,有不同类别的文本样式的创作。我们看的是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调用 - 这将是起点。
答案 1 :(得分:3)
Android中的这种Line Breaking算法真的很糟糕,它甚至在逻辑上都不正确 - 逗号不能是一行的最后一个字符。它只会产生不必要的换行符,导致非常奇怪的文本布局。
答案 2 :(得分: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);
}
}
在这里。我将一些特殊字符从半角改为全角,例如“,”“。”,效果非常好。你可以试试。