android - open - Cómo hacer los 3 tipos de enlaces en textview
open url textview android (2)
Tienes que usar el carácter "backslash /
to scape "
para que la cadena no lo considere como el punto final de la cadena. Es decir, se considera una cadena cuando todo el texto está dentro de dos ""
. Tienes que escabullir "
caracteres en su url porque si no la cadena considerará que debe terminar cuando encuentre un nuevo "
carácter "
, en este caso en su url.
"All three should link out http://google.com and <a href=/"http://google.com/">here link</a> and <a href=/"http://google.com/">http://google.com</a>"
Me gustaría hacer clic en todos los enlaces de la vista de texto.
El texto de ejemplo es:
"All three should link out http://google.com and <a href="http://google.com">here link</a> and <a href="http://google.com">http://google.com</a>"
Si uso MovementMethod con el texto html, solo se puede hacer clic en el segundo y tercer enlace. Si utilizo Linkify (o mezclo ambos) solo se puede hacer clic en el primer y segundo enlace.
¿Cómo puedo hacer que todos puedan hacer clic?
Después de la investigación, descubrí que el método Linkify.addLinks () elimina los tramos actuales del texto y aplica una nueva (en función, por ejemplo, de la URL de la página web). Por eso, mis tramos de Html.fromHtml () se eliminaron al principio y nunca se vuelven a aplicar.
Entonces lo hice siguiente:
1. Lee el texto de htmml Html.fromHtml, que me proporciona el obj extendido con html spans.
2. Guardar tramos de html en matriz
3. Hacer linkify.addLinks - este método elimina mis antiguos tramos así que tendré que volver a agregarlo
4. Agregue tramos antiguos
5. Establecer texto en la vista de texto.
Implementación:
private void setLabel(){
label.setText(linkifyHTML(Html.fromHtml("text with links here"));
label.setMovementMethod(LinkMovementMethod.getInstance());
label.setLinkTextColor(getRes().getColor(R.color.link));
}
private Spannable linkifyHTML(CharSequence text) {
Spannable s = new SpannableString(text);
URLSpan[] old = s.getSpans(0, s.length(), URLSpan.class);
LinkSpec oldLinks[] = new LinkSpec[old.length];
for (int i = 0; i < old.length; i++) {
oldLinks[i] = new LinkSpec(old[i], s.getSpanStart(old[i]), s.getSpanEnd(old[i]));
}
Linkify.addLinks(s, Linkify.ALL);
for (LinkSpec span : oldLinks) {
s.setSpan(span.span, span.start, span.end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return s;
}
class LinkSpec {
final URLSpan span;
final int start, end;
public LinkSpec(URLSpan urlSpan, int spanStart, int spanEnd) {
span = urlSpan;
start = spanStart;
end = spanEnd;
}
}