Как реализовать правильную обратную навигацию в android WebView исключающую редирект страниц

Рейтинг: 0Ответов: 1Опубликовано: 28.06.2023

При нажатии кнопки назад на некоторых страницах происходит редирект и история url зацикливается.

Поясню подробнее:

просматриваю страницы в webView - страница_1 -> страница_2 -> страница_3 -> страница_3.1 -> страница_4 (страница_3.1 - это редирект со страницы_3)

Возвращаясь обратно, при попадании на страницу_3 в стек падает страница_3.1 и так бесконечно... Если быстро дважды нажать кнопку back, то можно проскочить страницу_3 минуя редирект.

В общем задача при обратной навигации исключить любой редирект в webView!

Пробовал использовать goBackOrForward(-2) в методе onKeyDown(), но полноценно рабочий алгоритм выполнения двойного клика построить не смог, так как в историю url попадает редирект и проверку на соответствие адреса для перехода произвести не возможно. Прочитал документацию webView, очень много искал в сети, но решения не подходят...

Спасибо!

Ответы

▲ 0

Попробуйте записывать историю посещённых сайтов в ArrayList и при редиректе загружать url 3 в списке страницы:

ArrayList URLList = new ArrayList();
webView.setWebViewClient(new MyWebViewClient());
...
private class MyWebViewClient extends WebViewClient {
    @TargetApi(Build.VERSION_CODES.N)
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        view.loadUrl(request.getUrl().toString());
        URLList.add(request.getUrl().toString())
        return true;
    }

    // Для старых устройств
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        URLList.add(utl)
        return true;
    }
}
...
public void Back(View view){
     webView.loadUrl(URLList.get(2));
}

Чтобы определить редирект, думаю, можно использовать ответы от сервера (301 или 302 список ошибок и номера для getErrorCode). Могу лишь предложить, но я не уверен, что будет правильно работать:

public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
            super.onReceivedError(view, request, error);
            int errorCode = error.getErrorCode();
            if(errorCode == -9){
               //Редирект
            }
}