Android: метод WebView goBack() показывает пустую страницу

У меня есть приложение для Android, которое загружает веб-страницы в виде действия с помощью WebView. Я использую извлечение страницы вручную и используя WebView loadDataWithBaseURL, чтобы отобразить ее на экране. Все в порядке.

Теперь я пытаюсь переопределить кнопку "Назад" , чтобы имитировать возврат в стек истории WebView. Я могу переопределить нажатие кнопки "Назад" , я вижу, что в WebView есть стек истории, я вижу, что URL-адрес истории верен, но когда я вызываю метод WebView goBack() он отображает пустую страницу.

Кто-нибудь сталкивался с этим раньше или дал мне пару предложений, чтобы исходить из этого?

Изменить. Если я использую метод WebView loadUrl, кнопка "Назад" с переопределением работает по назначению. Но почему.... Если мне нужно справиться с этим вручную, как мне начать возиться со страницами истории?

Ответ 1

У меня тоже проблема. Я обнаружил, что проблема исчезла, если я установил параметр historyUrl в вызове loadDataWithBaseURL.

Ответ 2

Вы должны проверить, возвращает ли метод canGoBack() значение true перед вызовом goBack()

Ответ 3

Единственное решение, которое я нашел, - создать Stack <String> и вручную управлять историей

Ответ 4

У меня была такая же проблема, и я пробовал все ответы, но ничего не помогал (протестировал их все на Nexus 5, работающем с Marshmallow). Решение loadDataWithBaseURL не имело для меня отношения, поскольку вместо этого я использовал loadUrl.

Теперь это не решение, а то, что я, к счастью, заметил. Эта вещь действительно странная и работает только в том случае, если целевой URL заканчивается на .html. Мое намерение состоит в том, чтобы помочь любому, кто сталкивается с этой проблемой, поскольку я знаю, насколько это раздражает. Поэтому, пожалуйста, несите меня, пожалуйста не голосуйте за этот ответ, если считаете, что это глупость.

Я заметил, что если URL-адрес заканчивается на .html, этот белый экран появляется, когда нажата кнопка "Назад".

С другой стороны, если вы удалите этот .html из своего URL-адреса - очевидно, только если это поддерживается этим сайтом (т.е. перенаправление и все правильно обрабатываются на стороне сервера и что он не вызывает 404 Ошибка страницы не найдена), этот url будет действовать как ваша база в этот раз, и когда вы нажмете кнопку "Назад", этот белый экран не появится на этот раз.

например: вы должны заменить http://example.com/page.html: http://example.com/page

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

Ответ 5

То, как я это делаю, заключается в том, что указатель локального стека на число загруженных страниц после загрузки корневой страницы с помощью 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.