如何防止EditText在标点符号后断行

时间:2011-05-26 06:17:36

标签: android text line android-edittext punctuation

默认情况下,如果行比视图长,Android EditText会断行,如下所示:

Thisisalineanditisveryverylongs (end of view)
othisisanotherline

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

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

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

Thisisalineanditsnotsolong;andt (end of view)
hisisanotherline

必须有办法实现这一目标,对吗?到目前为止,我还没有找到这样做。

3 个答案:

答案 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); 
    }
}

在这里。我将一些特殊字符从半角改为全角,例如“,”“。”,效果非常好。你可以试试。