Как реализовать правильную обратную навигацию в android WebView исключающую редирект страниц
При нажатии кнопки назад на некоторых страницах происходит редирект и история url зацикливается.
Поясню подробнее:
просматриваю страницы в webView - страница_1 -> страница_2 -> страница_3 -> страница_3.1 -> страница_4 (страница_3.1 - это редирект со страницы_3)
Возвращаясь обратно, при попадании на страницу_3 в стек падает страница_3.1 и так бесконечно... Если быстро дважды нажать кнопку back, то можно проскочить страницу_3 минуя редирект.
В общем задача при обратной навигации исключить любой редирект в webView!
Пробовал использовать goBackOrForward(-2) в методе onKeyDown(), но полноценно рабочий алгоритм выполнения двойного клика построить не смог, так как в историю url попадает редирект и проверку на соответствие адреса для перехода произвести не возможно.
Прочитал документацию webView, очень много искал в сети, но решения не подходят...
Спасибо!
Ответы (1 шт):
Попробуйте записывать историю посещённых сайтов в 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){
//Редирект
}
}