android android-textview linkify selectable

android - TextView que está vinculado y seleccionable?



android-textview linkify (3)

¿Intentaste agregar esto en tu código XML de TextView?

<TextView ... android:autoLink="all" android:textIsSelectable="true" />

Lo he probado en mi código y puedo hacer una llamada / navegar en la web / correo y también seleccionar todo el texto.

Me gustaría tener un TextView que sea seleccionable y enlazado. Cuando hago ambas cosas, termino con texto seleccionable pero no se puede hacer clic en los enlaces.

EDITAR:

Te mostraré el código para explicar con lo que lucho:

TextView textView = view.findViewById(R.id.mytext); textView.setText("My text: +4412345678 Go to website: www.google.com Blah blah"); Linkify.addLinks(textView, Linkify.ALL); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { textView.setTextIsSelectable(true); }


El atributo autoLink tiene un error molesto: si hace clic en su ejemplo en el número de teléfono, luego regresa y hace clic en el segundo enlace de URL: abrirá el número de teléfono nuevamente. Este atributo funciona tan mal con varios enlaces, que he implementado mi propia clase, aquí está el enlace en Github ClickableLinksTextView.java

En su ejemplo, puede reemplazar su clase TextView por mi clase ClickableLinksTextView en el diseño xml y cambiar el código de esta manera:

ClickableLinksTextView textView = (ClickableLinksTextView)view.findViewById(R.id.mytext); textView.setText("My text: +4412345678 Go to website: www.google.com Blah blah"); Linkify.addLinks(textView, Linkify.ALL); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { textView.setMovementMethod(ArrowKeyMovementMethod.getInstance()); textView.setTextIsSelectable(true); // the autoLink attribute must be removed, if you hasn''t set it then ok, otherwise call textView.setAutoLink(0); }

La causa original del problema en su pregunta es que la clase LinkMovementMethod y el atributo textIsSelectable no son compatibles en absoluto, incluso los desarrolladores del sistema operativo Android lo admiten en el código fuente del sistema operativo Android .

No cambie el método de movimiento para el texto que admite la selección de texto, ya que evitaría un desplazamiento de cursor arbitrario.

Si la vista de texto es seleccionable, los únicos 2 valores correctos del método de movimiento son null y ArrowKeyMovementMethod . Es por eso que establezco ArrowKeyMovementMethod explícitamente en mi ejemplo, porque Linkify.addLinks establece un método de movimiento incorrecto y debo revertirlo.

En cuanto al error del atributo autoLink, es porque los desarrolladores de Android no han copiado correctamente la detección de enlaces. Puedes ver el ejemplo de código en la respuesta de @cheng yang, el código solo toma el primer enlace, sin importar cuántos de ellos tengas.


El problema está en TextView de Android. Llamar a Linkify.addLinks() no cambiaría la máscara de TextView automático en TextView . Creo que es un error de Android que comprueban mAutoLinkMask. Entonces, si establece android:autoLink en un archivo xml , o llama a setAutoLinkMask() a un valor distinto de 0, funcionará.

Para su información, el código fuente de TextView :

if (touchIsFinished && mLinksClickable && mAutoLinkMask != 0 && textIsSelectable) { // The LinkMovementMethod which should handle taps on links has not been installed // on non editable text that support text selection. // We reproduce its behavior here to open links for these. ClickableSpan[] links = ((Spannable) mText).getSpans(getSelectionStart(), getSelectionEnd(), ClickableSpan.class); if (links.length > 0) { links[0].onClick(this); handled = true; } }