Handle hace clic en los vínculos de TextView mientras utiliza Linkify para encontrar y establecer los vínculos dentro del texto
Tengo un TextView lleno de texto que obtengo de un servidor. Estoy usando Linkify para manejar toda la búsqueda de enlaces y para establecer un URLSpan donde sea necesario a través de su método addLinks.
El problema es que el comportamiento predeterminado al hacer clic en un enlace es abrirlo en un navegador, lo que quiero es obtener el enlace pulsado y manejarlo a mí mismo.
- Espaciado de párrafos con SpannableStringBuilder en TextView
- Cómo manejar evento onClick en imageSpan en editText?
- El botón setText con Spannable no funciona para Android 5.0 Lollipop
- Cómo obtener el ancho del texto cuando el ajuste de varios spannable
- SpannableString no se muestra correctamente en modo horizontal
No veo ningún método de Linkify que me permita establecer un "OnClick" o algo así …
Gracias por tu ayuda 🙂
- TextView con diferentes textSize
- Android: ¿Cómo combinar Spannable.setSpan con String.format?
- ImageSpan en EditText (smileys). Con el teclado SwiftKey no funciona
- Selección de TextView con Spannable y LinkMovementMethod
- Cómo convertir SpannedString a Spannable
- Agregar un relleno / margen a un Spannable
- Android SpannableString establecer fondo detrás de parte del texto
- Android Development: Cómo reemplazar parte de un EditText con un Spannable
Ok así que finalmente logré establecer mi propio "OnClickListener" a los enlaces de TextView. Mi solución fue copiar Linkify
a mi proyecto, el nombre de CustomLinkify
y sólo cambiar su método applyLink
:
De:
private static final void applyLink(String url, int start, int end, Spannable text) { URLSpan span = new URLSpan(url); text.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); }
A:
private static final void applyLink(final String url, int start, int end, Spannable text) { URLSpan span = new URLSpan(url) { @Override public void onClick(View widget) { _onLinkClickListener.onLinkClicked(url); } }; text.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); }
Donde _onLinkClickListener
es un campo nuevo, establecido por mí antes de usar el nuevo CustomLinkify
.
Sé que no es una solución muy elegante y yo prefería google para permitir la configuración de un oyente a través de la Linkify nativa, pero, para mí, esto es mejor que la aplicación de mis propias lógicas Spannable
(como se sugiere en otras preguntas relacionadas).
Confío en el código Linkify
y supongo que voy a comprobar de vez en cuando para ver si los cambios realizados en él, si es así, por supuesto, voy a actualizar CustomLinkify
con los cambios.
Espero que esto ayude a alguien.
También me resulta tedioso implementar lógicas personalizadas de Spannable en la aplicación, y termino creando una biblioteca para esto. Véase Textoo .
Con Textoo
, esto se puede lograr como:
TextView myTextView = Textoo .config((TextView) findViewById(R.id.my_text_view)) .linkifyEmailAddresses() .linkifyMapAddresses() .linkifyPhoneNumbers() .linkifyWebUrls() // or just .linkifyAll() .linkify(patternSettings, "internal://settings/") .linkify(patternGoogle, "http://www.google.ie/search2?q=", null, transformFilter) .linkify(patternGoogle, "http://www.google.ie/search3?q=", matchFilter, transformFilter) .addLinksHandler(new LinksHandler() { @Override public boolean onClick(View view, String url) { if ("internal://settings/location".equals(url)) { Intent locSettings = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(locSettings); return true; } else { return false; } } }) .apply();
Sólo para compartir y esperar que alguien lo encuentre útil.
Tal vez debería utilizar un WebView en lugar de un TextView?