Ответ 1
У меня тоже проблема. Я обнаружил, что проблема исчезла, если я установил параметр historyUrl в вызове loadDataWithBaseURL.
У меня есть приложение для Android, которое загружает веб-страницы в виде действия с помощью WebView. Я использую извлечение страницы вручную и используя WebView loadDataWithBaseURL, чтобы отобразить ее на экране. Все в порядке.
Теперь я пытаюсь переопределить кнопку "Назад" , чтобы имитировать возврат в стек истории WebView. Я могу переопределить нажатие кнопки "Назад" , я вижу, что в WebView есть стек истории, я вижу, что URL-адрес истории верен, но когда я вызываю метод WebView goBack() он отображает пустую страницу.
Кто-нибудь сталкивался с этим раньше или дал мне пару предложений, чтобы исходить из этого?
Изменить. Если я использую метод WebView loadUrl, кнопка "Назад" с переопределением работает по назначению. Но почему.... Если мне нужно справиться с этим вручную, как мне начать возиться со страницами истории?
У меня тоже проблема. Я обнаружил, что проблема исчезла, если я установил параметр historyUrl в вызове loadDataWithBaseURL.
Вы должны проверить, возвращает ли метод canGoBack() значение true перед вызовом goBack()
Единственное решение, которое я нашел, - создать Stack <String> и вручную управлять историей
У меня была такая же проблема, и я пробовал все ответы, но ничего не помогал (протестировал их все на Nexus 5, работающем с Marshmallow). Решение loadDataWithBaseURL
не имело для меня отношения, поскольку вместо этого я использовал loadUrl
.
Теперь это не решение, а то, что я, к счастью, заметил. Эта вещь действительно странная и работает только в том случае, если целевой URL заканчивается на .html
. Мое намерение состоит в том, чтобы помочь любому, кто сталкивается с этой проблемой, поскольку я знаю, насколько это раздражает. Поэтому, пожалуйста, несите меня, пожалуйста не голосуйте за этот ответ, если считаете, что это глупость.
Я заметил, что если URL-адрес заканчивается на .html
, этот белый экран появляется, когда нажата кнопка "Назад".
С другой стороны, если вы удалите этот .html
из своего URL-адреса - очевидно, только если это поддерживается этим сайтом (т.е. перенаправление и все правильно обрабатываются на стороне сервера и что он не вызывает 404 Ошибка страницы не найдена), этот url будет действовать как ваша база в этот раз, и когда вы нажмете кнопку "Назад", этот белый экран не появится на этот раз.
например: вы должны заменить http://example.com/page.html: http://example.com/page
Опять же, я не публикую это без тщательного тестирования - это работает для меня сегодня, и я счастлив, что нашел это, и надеюсь, что это тоже поможет.
То, как я это делаю, заключается в том, что указатель локального стека на число загруженных страниц после загрузки корневой страницы с помощью loadDataWithBaseURL
. Вернувшись назад, если мой указатель попадает в 1, я на корневом уровне и перезагружаю корневую страницу с помощью loadDataWithBaseURL
.
FYI, я использую этот код в "Действиях с фрагментами", поэтому фрагменты реализуют интерфейс IBackButtonListener, который помогает мне захватить кнопку "Назад" в основном действии и распространять событие на текущий фрагмент. Если фрагмент возвращает true, это означает, что он позаботился о событии.
IBackbuttonListener.java
public interface IBackButtonListener {
public boolean onBackButtonPressed();
}
Фрагмент, который реализует IBackButtonListener и имеет веб-просмотр, загруженный из html-данных.
private int historyStackPointer = 0;
...
@Override
public boolean onBackButtonPressed() {
boolean rtn = false;
if (webView.canGoBack()) {
if(historyStackPointer > 1) {
webView.goBack();
historyStackPointer--;
rtn = true;
}else{
if(historyStackPointer == 1) {
// Reload the html data
webView.loadDataWithBaseURL("file:///android_asset/", html_data, "text/html", "UTF-8", null);
historyStackPointer = 0;
rtn = true;
}else{
webView.loadUrl("about:blank");
rtn = false;
}
}
} else {
rtn = false;
}
return rtn;
}
html_data - это строка со страницей html.