Atualmente, estou processando entrada HTML em um TextView da seguinte forma:
tv.setText(Html.fromHtml("<a href='test'>test</a>"));
O HTML exibido é fornecido a mim por meio de um recurso externo; portanto, não posso mudar as coisas da maneira que quiser, mas é claro que posso alterar algumas expressões regulares do HTML, para alterar o valor href, digamos, para outra coisa.
O que eu quero é poder manipular um clique no link diretamente de dentro do aplicativo, em vez de abrir o link da janela do navegador. Isso é realizável? Suponho que seria possível definir o protocolo do valor href para algo como "myApp: //" e, em seguida, registrar algo que permitiria ao meu aplicativo lidar com esse protocolo. Se essa é realmente a melhor maneira, eu gostaria de saber como isso é feito, mas espero que exista uma maneira mais fácil de dizer "quando um link for clicado nesta visualização de texto, eu quero criar um evento que receba o valor href do link como um parâmetro de entrada "
Respostas:
Chegando a isso quase um ano depois, há uma maneira diferente de resolver o meu problema específico. Como eu queria que o link fosse tratado pelo meu próprio aplicativo, existe uma solução um pouco mais simples.
Além do filtro de intenção padrão, simplesmente deixo minha atividade de destino ouvir
ACTION_VIEW
intenções e, especificamente, aquelas com o esquemacom.package.name
Isso significa que os links que começam com
com.package.name://
serão tratados pela minha atividade.Então, tudo o que preciso fazer é construir uma URL que contenha as informações que desejo transmitir:
Na minha atividade de destino, posso recuperar este endereço:
No meu exemplo, eu poderia simplesmente verificar
data
valores nulos, porque sempre que não for nulo, saberei que foi invocado por meio desse link. A partir daí, extraio as instruções necessárias do URL para poder exibir os dados apropriados.fonte
getData
fornece o URI completo, você também pode usargetDataString
isso para gerar uma representação de texto. De qualquer forma, você pode construir a URL para conter todos os dados necessárioscom.package.name://my-action/1/2/3/4
e extrair as informações dessa sequência.Uri data = getIntent().getData();
? Eu continuo recebendoActivity not found to handle intent
erro. - GraçasOutra maneira, empresta um pouco do Linkify, mas permite que você personalize seu tratamento.
Classe de extensão personalizada:
Função auxiliar:
Uso:
fonte
se houver vários links na exibição de texto. Por exemplo, o textview tem "https: //" e "tel no", podemos personalizar o método LinkMovement e manipular cliques para palavras com base em um padrão. Em anexo está o método de movimento de link personalizado.
Isso deve ser chamado a partir da visualização de texto da seguinte maneira:
fonte
widget.getContext()
.Aqui está uma solução mais genérica baseada na resposta @Arun
Para usá-lo basta implementar
onLinkClick
deTextViewLinkHandler
classe. Por exemplo:fonte
é muito simples adicionar esta linha ao seu código:
fonte
Solução
Eu implementei uma classe pequena com a ajuda da qual você pode lidar com cliques longos no próprio TextView e tocar nos links do TextView.
Layout
TextViewClickMovement.java
Uso
Ligações
Espero que isto ajude! Você pode encontrar o código aqui .
fonte
Apenas para compartilhar uma solução alternativa usando uma biblioteca que eu criei. Com o Textoo , isso pode ser alcançado como:
Ou com fonte HTML dinâmica:
fonte
para quem procura mais opções, aqui está uma
RECURSO: CodePath
fonte
fonte
Alterei a cor do TextView para azul usando, por exemplo:
no arquivo xml. Como torná-lo sublinhado é explicado aqui .
Em seguida, use sua propriedade onClick para especificar um método (acho que você poderia chamar de
setOnClickListener(this)
outra maneira), por exemplo:Nesse método, eu posso fazer o que eu quiser normalmente, como iniciar uma intenção. Observe que você ainda precisa fazer a
myTextView.setMovementMethod(LinkMovementMethod.getInstance());
coisa normal , como no método onCreate () da sua atividade.fonte
Esta resposta estende a excelente solução de Jonathan S:
Você pode usar o seguinte método para extrair links do texto:
Isso pode ser usado para remover um dos parâmetros no
clickify()
método:Algumas alterações no ClickSpan:
Agora você pode simplesmente definir o texto no TextView e adicionar um ouvinte a ele:
fonte
A melhor maneira que usei e sempre funcionou para mim
fonte
Exemplo: suponha que você tenha definido algum texto na visualização de texto e deseje fornecer um link para uma expressão de texto específica: "Clique em #facebook o facebook.com"
No layout xml:
Em Atividade:
Crie também um provedor de tags como:
No arquivo de manifesto, faça como entrada a atividade do provedor e teste como:
Agora, quando você clicar em #facebook, ele ativará testactivtiy. E na atividade de teste, você pode obter os dados como:
fonte