Eu tenho um TextView que está renderizando HTML básico, contendo 2+ links. Preciso capturar cliques nos links e abri-los - em meu próprio WebView interno (não no navegador padrão).
O método mais comum para lidar com a renderização de links parece ser assim:
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 ) );
No entanto, isso faz com que os links sejam abertos no navegador da web interno padrão (mostrando a caixa de diálogo "Concluir ação usando ...").
Tentei implementar um onClickListener, que é acionado corretamente quando o link é clicado, mas não sei como determinar QUAL link foi clicado ...
text_view.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// what now...?
}
});
Como alternativa, tentei criar uma classe 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;
}
Ideias?
Solução de exemplo
Eu vim com uma solução que analisa os links de uma string HTML e os torna clicáveis, e então permite que você responda ao URL.
span.getURL()
".) Você pode até postar como uma resposta, pois é melhor do que a resposta aceita atualmente!Respostas:
Com base em outra resposta , aqui está uma função setTextViewHTML () que analisa os links de uma string HTML e os torna clicáveis, e então permite que você responda ao URL.
fonte
ListView
s quando aView
'sfocusable
é definido como verdadeiro. Isso geralmente acontece comButton
s /ImageButton
s. Tente ligarsetFocusable(false)
para o seuTextView
.text.setMovementMethod(LinkMovementMethod.getInstance());
se não estiver usando, URLSpanVocê fez o seguinte:
você tentou na ordem inversa, conforme mostrado abaixo?
e sem:
fonte
Isso pode ser resolvido simplesmente usando Spannable String. O que você realmente deseja fazer (Requisito de Negócios) não está claro para mim, então o código a seguir não dará uma resposta exata para sua situação, mas tenho certeza de que isso lhe dará uma ideia e você poderá resolver seu problema com base no código a seguir.
Ao fazer isso, também estou obtendo alguns dados via resposta HTTP e adicionei algum texto sublinhado adicional no meu caso "mais" e esse texto sublinhado abrirá o navegador da web no evento de clique. Espero que isso ajude você.
fonte
Eu tive o mesmo problema, mas muito texto misturado com poucos links e e-mails. Acho que usar 'autoLink' é uma maneira mais fácil e limpa de fazer isso:
Você pode definir Linkify.EMAIL_ADDRESSES ou Linkify.WEB_URLS se houver apenas um deles que você deseja usar ou definir a partir do layout XML
As opções disponíveis são: nenhum, web, e-mail, telefone, mapa, todos
fonte
Solução
Eu implementei uma pequena classe com a ajuda da qual você pode lidar com longos cliques no próprio TextView e Taps nos links no TextView.
Layout
TextViewClickMovement.java
Uso
Links
Espero que isso ajude! Você pode encontrar o código aqui .
fonte
text_view.setMovementMethod(new TextViewClickMovement(this, context));
; O Android Studio está reclamando quecontext
não foi possível resolver.Uma solução mais limpa e melhor, usando a biblioteca nativa Linkify .
Exemplo:
fonte
Fiz uma função de extensão fácil em Kotlin para capturar cliques de link de url em um TextView aplicando um novo retorno de chamada a elementos URLSpan.
strings.xml (exemplo de link em texto)
Certifique-se de que seu texto estendido esteja definido como TextView antes de chamar "handleUrlClicks"
Esta é a função de extensão:
É assim que eu chamo:
fonte
Se você estiver usando Kotlin, escrevi uma extensão simples para este caso:
Uso:
fonte
Uma abordagem alternativa, imho way mais simples (para desenvolvedores preguiçosos como eu;)
Se necessário, você também pode verificar o esquema / tipo MIME da intenção
fonte
Estou usando apenas textView e defina a extensão para url e clique em identificador.
Achei uma solução muito elegante aqui, sem linkify - de acordo com isso eu sei qual parte da string desejo linkify
lidar com textview link clique em meu aplicativo Android
em kotlin:
e uso: linkify (yourTextView, urlString, context)
fonte