Сделать автоматические ссылки Webview видимыми

Веб-просмотр будет отображать ссылки в HTML-содержимом с синим подчеркиванием. Итак, если у вас есть что-то в HTML, например

<a href="...">blah blah</a>

... это хорошо видно как ссылку.

Веб-просмотр также позволяет вам нажимать на телефонные номера и адреса (даже если это просто текст в HTML, а не ссылки), чтобы запустить номеронабиратель или карты.

Как заставить Webview отображать эти (возможно, Linkify) ссылки с подчеркиванием и т. д.? Это достаточно просто в TextView, так как можно получить промежутки из TextView и стилизовать их, но Webview не предоставляет никакого способа получить эти данные... по крайней мере, я не вижу, просматривая документы.


person Turnsole    schedule 16.03.2012    source источник
comment
Любые идеи? Подсказки? Я был бы признателен даже за полуобразованное направление, к которому можно было бы стремиться.   -  person Turnsole    schedule 21.03.2012


Ответы (2)


Учитывая это:

похоже, это все еще не способ сделать это напрямую с Java. Одна вещь, которая может сработать, — написать некоторый код JavaScript и запустить его после загрузки страницы, например. как указано здесь:

Вот пример похожей вещи:

где идея состоит в том, чтобы отключить ссылки. Вы можете использовать аналогичный подход, чтобы добавить немного CSS, включая подчеркивание. Пара других SOq/ссылок, которые могут помочь:

Надеюсь это поможет.

person icyrock.com    schedule 24.03.2012
comment
Конечно - вы пробовали подход с отключением ссылок? Если да, то что не получилось? - person icyrock.com; 27.03.2012
comment
Я читал эту ветку. Моя проблема связана со ссылками на Карты. URL-адреса и телефонные номера имеют довольно простой шаблон регулярного выражения, поэтому что-то подобное будет работать нормально; но обнаружение адреса в тексте — нетривиальная задача, которая уже решается тем, что накладывает невидимые ссылки на представление. Я действительно просто хочу выяснить, как эти ссылки попадают туда, и сделать их видимыми. - person Turnsole; 28.03.2012

Вот некоторый код JS, который можно внедрить для привязки телефонных номеров, адресов электронной почты и URL-адресов:

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

            }
person Fedir Tsapana    schedule 06.08.2013