2 votes

Rendre les liens automatiques de Webview visibles

Un Webview affichera les liens dans le contenu HTML comme ayant des soulignements bleus. Donc si vous avez quelque chose dans le HTML comme

blah blah

... c'est clairement visible comme un lien.

Le Webview vous permet également de cliquer sur les numéros de téléphone et les adresses (même s'ils ne sont que du texte dans le HTML, pas des liens) pour lancer le Dialer ou Maps.

Comment peut-on amener Webview à afficher ces liens (Linkify, probablement) avec des soulignements, etc.? C'est assez facile dans un TextView puisqu'on peut obtenir les « spans » d'un TextView et les styliser, mais Webview ne semble pas offrir de moyen de récupérer ces données... du moins pas que je puisse voir en parcourant la documentation.

3voto

Steel FedeX Points 291

Voici un code JS qui peut être injecté pour rendre les numéros de téléphone, les e-mails et les URL interactifs :

            function linkify() {
                linkifyTexts(linkifyPhoneNumbers);
                linkifyTexts(linkifyEmails);
                linkifyTexts(linkifyWebAddresses1);
                linkifyTexts(linkifyWebAddresses2);
            }
            function linkifyPhoneNumbers(text) {
                text = text.replace(/\b\+?[0-9\-]+\*?\b/g, '$&');
                return text;
            }
            function linkifyEmails(text) {
                text = text.replace(/(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6})/gim, '$1');
                return text;
            }
            function linkifyWebAddresses1(text) {
                text = text.replace(/(\b(https?|ftp):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gim, '$1');
                return text;
            }
            function linkifyWebAddresses2(text) {
                text = text.replace(/(^|[^\/])(www\.[\S]+(\b|$))/gim, '$1$2');
                return text;
            }

            var linkifyTexts = function(replaceFunc)
            {
                var tNodes = [];
                getTextNodes(document.body,false,tNodes,false);                              
                var l = tNodes.length;
                while(l--)
                {
                    wrapNode(tNodes[l], replaceFunc);
                }
            }
            function getTextNodes(node, includeWhitespaceNodes,textNodes,match) {
                if (node.nodeType == 3) {
                    if (includeWhitespaceNodes || !/^\s*$/.test(node.nodeValue)) {
                        if(match){
                            if(match.test(node.nodeValue))
                                textNodes.push(node);
                        }
                        else {
                            textNodes.push(node);
                        }
                    }
                } else {
                    for (var i = 0, len = node.childNodes.length; i < len; ++i) {
                        var subnode = node.childNodes[i];
                        if (subnode.nodeName != "A") {
                            getTextNodes(subnode,includeWhitespaceNodes,textNodes,match);
                        }
                    }
                }

            }
            function wrapNode(n, replaceFunc) {
                var temp = document.createElement('div');
                if(n.data)
                    temp.innerHTML = replaceFunc(n.data);
                else{
                    //whatever
                }
                while (temp.firstChild) {
                    n.parentNode.insertBefore(temp.firstChild,n);

                }
                n.parentNode.removeChild(n);

            }

1voto

icyrock.com Points 13698

Étant donné ceci :

il semble toujours ne pas y avoir de moyen de le faire directement depuis Java. Une chose qui pourrait fonctionner est d'écrire un code JavaScript et de l'exécuter après le chargement de la page, par exemple comme indiqué ici :

Voici un exemple d'une chose similaire :

où l'idée est de désactiver les liens. Vous pouvez peut-être utiliser une approche similaire pour ajouter du CSS, y compris des soulignements. Quelques autres SOqs / liens qui pourraient aider :

En espérant que cela vous aide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X