Evite que TextView de Android rompa enlaces

Esta pregunta es probablemente la misma que ésta , pero como ninguna de sus respuestas realmente soluciona el problema, volveré a preguntar.

Mi aplicación tiene un TextView que ocasionalmente mostrará URL muy largas. Por razones estéticas (ya que las URL no contienen espacios), el comportamiento deseable sería llenar cada línea completamente antes de saltar a la siguiente, algo así:

|http://www.domain.com/som| |ething/otherthing/foobar/| |helloworld | 

¿Qué sucede en su lugar, es la URL que se rompe cerca de las barras, como si fueran espacios.

 |http://www.domain.com/ | |something/otherthing/ | |foobar/helloworld | 

He intentado ampliar la clase TextView y añadir una versión modificada del método breakManually ( encontrado aquí ) para engañar a TextView y hacer lo que necesito, llamándolo onSizeChanged (sobreescrito). Funciona bien, excepto por el hecho de que TextView está dentro de un ListView. Cuando este TextView personalizado está oculto por el desplazamiento y devuelto, su contenido se remonta al comportamiento de rotura original, debido a que la vista se vuelve a dibujar sin que se esté llamando onSizeChanged .

Pude trabajar alrededor de este problema llamando breakManually dentro de onDraw . Esto presenta el comportamiento esperado en todo momento, pero a un coste de alto rendimiento: ya que onDraw se llama cada vez que el ListView se desplaza y el método breakManually no es exactamente "ligero", el desplazamiento se vuelve inaceptablemente laggy, incluso en un quad de gama alta -core dispositivo.

El siguiente paso fue rastrear el código fuente de TextView , tratando de determinar dónde y cómo se divide el texto y, con suerte, anularlo. Esto fue un fracaso total. Yo (un novato) pasamos el día entero buscando infructuosamente el código que en su mayoría no podía entender.

Y eso me trae aquí. ¿Puede alguien por favor señalarme la dirección correcta sobre lo que debo anular (suponiendo que es posible)? O tal vez hay una manera más sencilla de lograr lo que quiero?

Aquí está el método breakManually que mencioné. Debido al uso de getWidth () , sólo funciona si se llama después de que se mide la vista.

 private CharSequence breakManually (CharSequence text) { int width = getWidth() - getPaddingLeft() - getPaddingRight(); // Can't break with a width of 0. if (width == 0) return text; Editable editable = new SpannableStringBuilder(text); //creates an array with the width of each character float[] widths = new float[editable.length()]; Paint p = getPaint(); p.getTextWidths(editable.toString(), widths); float currentWidth = 0.0f; int position = 0; int insertCount = 0; int initialLength = editable.length(); while (position < initialLength) { currentWidth += widths[position]; char curChar = editable.charAt(position + insertCount); if (curChar == '\n') { currentWidth = 0.0f; } else if (currentWidth > width) { editable.insert(position + insertCount , "\n"); insertCount++; currentWidth = widths[position]; } position++; } return editable.toString(); } 

A todos los que se molestaron en leer esto, gracias por su tiempo.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.