Android: метод WebView goBack () показывает пустую страницу - PullRequest
11 голосов
/ 26 августа 2010

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

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

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

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

Ответы [ 5 ]

6 голосов
/ 28 ноября 2010

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

1 голос
/ 26 августа 2010

Перед вызовом goBack ()

вы должны проверить, возвращает ли метод canGoBack () значение true.
0 голосов
/ 01 апреля 2017

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

0 голосов
/ 12 декабря 2016

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

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

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

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

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

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

0 голосов
/ 16 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...