Прослушивание изменения идентификатора фрагмента URL в WebView

Похоже, что методы WebViewClient, такие как shouldInterceptRequest(), onPageStarted() и shouldOverrideUrlLoading(), прослушивают только изменения URL-адресов, которые заставляют WebView загружать новую страницу. Есть ли способ обнаружить изменения URL-адресов для идентификаторов фрагментов, например index.html#fragment_id, в WebView?


person jpetitto    schedule 24.10.2014    source источник
comment
Используйте JavascriptInterface события webview и окна hashChange в javascript   -  person mitvenkatesan    schedule 30.10.2014


Ответы (2)


Я знаю, что это действительно старый вопрос, но я нашел решение, которого нет нигде в Stack Overflow. Ответ jpetitto работает, но он портит javascript, если мы используем изменение хэша для маршрутизации или других подобных функций.

Я обнаружил, что переопределяя метод doUpdateVisitedHistory в WebViewClient, мы можем перехватывать URL-адреса при изменении хэша. См. ниже фрагмент, например.

mWebView.setWebViewClient(new WebViewClient() {

        @Override
        public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) {
            super.doUpdateVisitedHistory(view, url, isReload);
            // somecode to run on hash change.
        }

}

Примечание: этот метод запускается при изменении хэша и URL-адреса.

person Srin    schedule 06.01.2016
comment
От кого-то, кто искал весь день: Спасибо. - person Tom; 28.06.2018
comment
Это отлично, он обнаружит изменение URL. А не могли бы вы подсказать, как переходить на страницы в SPA без перезагрузки страницы. Я ищу, но не мог получить никакой подсказки. Спасибо - person Ranjit Singh Shekhawat; 17.09.2020
comment
Я считаю, что вы хотите иметь маршрутизацию пути вместо маршрутизации хэша без перезагрузки страницы. В этом случае вы можете использовать историю API. developer.mozilla.org/en-US/docs/Web/API/ История - person Srin; 17.09.2020

Как описал mitvenkatesan в своем комментарии к вопросу, этого можно добиться, переопределив событие window.onhashchange() страницы внутри WebView.

Оказывается, это решение уже рассматривалось в другом вопросе.

person jpetitto    schedule 02.11.2014