Tengo un TextView que está renderizando HTML básico, que contiene más de 2 enlaces. Necesito capturar los clics en los enlaces y abrir los enlaces, en mi propio WebView interno (no en el navegador predeterminado).
El método más común para manejar la representación de enlaces parece ser el siguiente:
String str_links = "<a href='http://google.com'>Google</a><br /><a href='http://facebook.com'>Facebook</a>";
text_view.setLinksClickable(true);
text_view.setMovementMethod(LinkMovementMethod.getInstance());
text_view.setText( Html.fromHtml( str_links ) );
Sin embargo, esto hace que los enlaces se abran en el navegador web interno predeterminado (que muestra el cuadro de diálogo "Completar acción con ...").
Intenté implementar un onClickListener, que se activa correctamente cuando se hace clic en el enlace, pero no sé cómo determinar EN QUÉ enlace se hizo clic ...
text_view.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// what now...?
}
});
Alternativamente, intenté crear una clase LinkMovementMethod personalizada e implementar onTouchEvent ...
public boolean onTouchEvent(TextView widget, Spannable text, MotionEvent event) {
String url = text.toString();
// this doesn't work because the text is not necessarily a URL, or even a single link...
// eg, I don't know how to extract the clicked link from the greater paragraph of text
return false;
}
Ideas?
Solución de ejemplo
Se me ocurrió una solución que analiza los enlaces de una cadena HTML y hace que se pueda hacer clic en ellos, y luego te permite responder a la URL.
span.getURL()
".) ¡Incluso podría publicarlo como una respuesta, ya que es mejor que la respuesta aceptada actualmente!Respuestas:
Basado en otra respuesta , aquí hay una función setTextViewHTML () que analiza los enlaces de una cadena HTML y hace que se pueda hacer clic en ellos, y luego le permite responder a la URL.
fuente
ListView
s cuando unView
'sfocusable
se establece cierto. Esto suele ocurrir conButton
s /ImageButton
s. Intente llamarsetFocusable(false)
a suTextView
.text.setMovementMethod(LinkMovementMethod.getInstance());
si no usa URLSpanHas hecho lo siguiente:
¿Lo ha intentado en orden inverso como se muestra a continuación?
y sin:
fuente
Esto se puede resolver simplemente usando Spannable String. Lo que realmente quiere hacer (Requisito comercial) no está claro para mí, por lo que el siguiente código no dará una respuesta exacta a su situación, pero estoy seguro de que le dará una idea y podrá resolver su problema basándose en el siguiente código.
Mientras lo hace, también obtengo algunos datos a través de la respuesta HTTP y he agregado un texto subrayado adicional en mi caso "más" y este texto subrayado abrirá el navegador web en el evento de clic. Espero que esto le ayude.
fuente
He tenido el mismo problema, pero mucho texto mezclado con pocos enlaces y correos electrónicos. Creo que usar 'autoLink' es una forma más fácil y limpia de hacerlo:
Puede configurar Linkify.EMAIL_ADDRESSES o Linkify.WEB_URLS si solo hay uno de ellos que desea usar o configurar desde el diseño XML
Las opciones disponibles son: ninguna, web, correo electrónico, teléfono, mapa, todas
fuente
Solución
He implementado una pequeña clase con la ayuda de la cual puede manejar clics largos en TextView y Taps en los enlaces en TextView.
Diseño
TextViewClickMovement.java
Uso
Enlaces
¡Espero que esto ayude! Puede encontrar el código aquí .
fuente
text_view.setMovementMethod(new TextViewClickMovement(this, context));
; Android Studio se queja de quecontext
no se pudo resolver.Una solución mucho más limpia y mejor, utilizando la biblioteca Linkify nativa .
Ejemplo:
fuente
Hice una función de extensión fácil en Kotlin para capturar los clics de enlaces de URL en un TextView aplicando una nueva devolución de llamada a los elementos URLSpan.
strings.xml (enlace de ejemplo en texto)
Asegúrese de que el texto distribuido esté configurado en TextView antes de llamar a "handleUrlClicks"
Esta es la función de extensión:
Así es como lo llamo:
fuente
Si está usando Kotlin, escribí una extensión simple para este caso:
Uso:
fuente
Un enfoque alternativo, en mi humilde opinión, más simple (para desarrolladores perezosos como yo;)
Si es necesario, también puede verificar el esquema / tipo mime de la intención
fuente
Estoy usando solo textView, y configuro el intervalo para la URL y el control de clic.
Encontré una solución muy elegante aquí, sin vincular, de acuerdo con eso, sé qué parte de la cadena quiero vincular
manejar el enlace de vista de texto, haga clic en mi aplicación de Android
en kotlin:
y uso: linkify (yourTextView, urlString, context)
fuente