Actualmente estoy representando la entrada HTML en un TextView así:
tv.setText(Html.fromHtml("<a href='test'>test</a>"));
El HTML que se muestra se me proporciona a través de un recurso externo, por lo que no puedo cambiar las cosas como lo haré, pero, por supuesto, puedo alterar la expresión regular con el HTML, para cambiar el valor href, por ejemplo, a otra cosa.
Lo que quiero es poder manejar un clic en el enlace directamente desde la aplicación, en lugar de que el enlace abra una ventana del navegador. ¿Es esto posible en absoluto? Supongo que sería posible establecer el protocolo del valor href en algo como "myApp: //", y luego registrar algo que permita que mi aplicación maneje ese protocolo. Si esta es realmente la mejor manera, me gustaría saber cómo se hace, pero espero que haya una manera más fácil de decir, "cuando se hace clic en un enlace en esta vista de texto, quiero generar un evento que reciba el valor href del enlace como parámetro de entrada "
Respuestas:
Llegando a esto casi un año después, hay una manera diferente de resolver mi problema particular. Como quería que el enlace fuera manejado por mi propia aplicación, hay una solución que es un poco más simple.
Además del filtro de intención predeterminado, simplemente dejo que mi actividad objetivo escuche las
ACTION_VIEW
intenciones, y específicamente, aquellas con el esquemacom.package.name
Esto significa que los enlaces que comiencen
com.package.name://
serán manejados por mi actividad.Entonces, todo lo que tengo que hacer es construir una URL que contenga la información que quiero transmitir:
En mi actividad objetivo, puedo recuperar esta dirección:
En mi ejemplo, simplemente podría verificar
data
los valores nulos, porque cuando alguna vez no sea nulo, sabré que se invocó mediante dicho enlace. A partir de ahí, extraigo las instrucciones que necesito de la url para poder mostrar los datos apropiados.fuente
getData
le proporciona el URI completo, también podría usarlo paragetDataString
obtener una representación de texto. De cualquier manera, puede construir la URL para que contenga todos los datos que necesitacom.package.name://my-action/1/2/3/4
, y puede extraer la información de esa cadena.Uri data = getIntent().getData();
? Sigo recibiendoActivity not found to handle intent
errores. - GraciasOtra forma, toma prestado un poco de Linkify, pero le permite personalizar su manejo.
Clase de alcance personalizado:
Función auxiliar:
Uso:
fuente
si hay múltiples enlaces en la vista de texto. Por ejemplo, textview tiene "https: //" y "tel no". Podemos personalizar el método LinkMovement y manejar los clics de las palabras según un patrón. Se adjunta el método de movimiento de enlace personalizado.
Esto debería llamarse desde la vista de texto de la siguiente manera:
fuente
widget.getContext()
en su lugar.Aquí hay una solución más genérica basada en la respuesta @Arun
Para usarlo simplemente poner en práctica
onLinkClick
deTextViewLinkHandler
clase. Por ejemplo:fuente
es muy simple agregar esta línea a su código:
fuente
Solución
He implementado una pequeña clase con la ayuda de la cual puedes manejar clics largos en TextView y Toques en los enlaces en TextView.
Diseño
TextViewClickMovement.java
Uso
Enlaces
¡Espero que esto ayude! Puedes encontrar el código aquí .
fuente
Solo para compartir una solución alternativa usando una biblioteca que creé. Con Textoo , esto se puede lograr como:
O con fuente HTML dinámica:
fuente
para quien busca más opciones aquí es uno
RECURSO: CodePath
fuente
fuente
Cambié el color de TextView a azul usando, por ejemplo:
en el archivo xml. Aquí se explica cómo subrayarlo .
Luego use su propiedad onClick para especificar un método (supongo que podría llamar de
setOnClickListener(this)
otra manera), por ejemplo:En ese método, puedo hacer lo que quiera de forma normal, como lanzar una intención. Tenga en cuenta que todavía tiene que hacer lo normal
myTextView.setMovementMethod(LinkMovementMethod.getInstance());
, como en el método onCreate () de su actividad.fuente
Esta respuesta extiende la excelente solución de Jonathan S:
Puede usar el siguiente método para extraer enlaces del texto:
Esto se puede usar para eliminar uno de los parámetros del
clickify()
método:Algunos cambios en ClickSpan:
Ahora puede simplemente configurar el texto en TextView y luego agregar un oyente:
fuente
La mejor forma que usé y siempre funcionó para mí
fuente
Ejemplo: suponga que ha configurado un texto en la vista de texto y desea proporcionar un enlace a una expresión de texto particular: "Haga clic en #facebook lo llevará a facebook.com"
En diseño xml:
En actividad:
También cree un proveedor de etiquetas como:
En el archivo de manifiesto, haga una entrada para el proveedor y pruebe la actividad como:
Ahora, cuando haga clic en #facebook, invocará la testactividad. Y en la actividad de prueba puede obtener los datos como:
fuente