Cómo evitar que EditText rompa una línea después de la puntuación

Por defecto, un Android EditText romperá una línea si la línea es más larga que la vista, como esto:

Thisisalineanditisveryverylongs (end of view) othisisanotherline 

O si la línea contiene un carácter de puntuación, como este:

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

Como requisito de mi trabajo, el texto tiene que romper una línea sólo si la línea es más larga que la vista, como esto:

 Thisisalineanditsnotsolong;andt (end of view) hisisanotherline 

Debe haber una manera de lograr esto, ¿verdad? Hasta ahora no he encontrado de todos modos para hacer esto.

La forma en que TextView (y EditText) rompe el texto es a través de llamadas de función privadas a BoringLayout internamente. Por lo tanto, la mejor manera sería sublcass EditText y reescribir estas funciones. Pero no será una tarea trivial.

Por lo tanto, en la clase TextView hay creaciones de diferentes clases para el estilo de texto. El que buscamos es DynamicLayout. En esta clase llegamos a una referencia de la clase StaticLayout (en una variable llamada reflujo). En el constructor de esta clase se encuentra el algoritmo de ajuste de texto:

 /* * 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; 

Aquí es donde va todo el envoltorio. Así que necesitará subclases para cuidar de StaticLayout, DynamicLayout, TextView y finalmente EditText que – estoy seguro – será una pesadilla 🙁 No estoy seguro de cómo va todo el flujo Si quieres – eche un vistazo a TextView primero Y compruebe las llamadas de getLinesCount – este será el punto de partida.

Este algoritmo de Line Breaking en Android realmente apesta, ni siquiera es lógicamente correcto – una coma no puede ser el último carácter de una línea. Sólo produce saltos de línea innecesarios, lo que resulta en un diseño de texto extremadamente extraño.

Hola Aquí hay un método que primero consigo de otro chico y luego hacer un poco de cambios, realmente funciona para mí usted puede tener un intento.

 //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); } } 

aquí está. Cambio algunos caracteres especiales de la mitad de la esquina a la esquina completa, como "," ".", Y el efecto es bastante bueno. Puedes intentarlo.

  • Android Justify spanable Visualización de texto compatible con RTL Languages
  • El botón de Android y el tamaño del texto
  • Cómo buscar texto en la vista web
  • ¿Cómo aplicar diferentes iconos y texto diferente en el tutorial de vista de cuadrícula de Android?
  • Android cómo dividir entre dos textview el ancho completo de pantalla exactamente cincuenta por ciento cincuenta?
  • android: establece textColor con el atributo textAppearance
  • Android ImageButton con imagen y texto
  • Cómo buscar un texto largo?
  • Puedo definir el texto de alineación intermedia en un archivo xml de diseño de Android
  • Android: cambia el color de la fuente al hacer clic
  • Archivo de texto adjunto de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.