Способ, которым 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 - это будет отправной точкой.