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.

  • ¿Cómo ajustar el texto en el botón?
  • QPushButton ha duplicado texto después de la actualización Qt
  • ¿Cómo puedo añadir una nueva línea en formato html en android?
  • ¿Cómo mostrar el texto vectorizado usando libgdx?
  • Visualizando letras de MP3 song en Android
  • Texto grande en Android
  • Android EditText, problema del textWatcher del teclado
  • Palabra envuelta tex en lienzo Android
  • Almacena grandes cantidades de textos para la aplicación de Android
  • Paginación en Android TextView
  • Diálogo de texto de entrada de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.