Android:WebView的方法goBack()显示一个空白页面

时间:2010-08-26 11:36:31

标签: android android-webview

我有一个Android应用程序,它使用WebView加载活动中的网页。我正在使用手动检索页面并使用WebView的 loadDataWithBaseURL 在屏幕上显示它。那里的一切都很好。

现在,我正在尝试覆盖Back按钮按下以模拟返回WebView历史堆栈。我能够覆盖后退按钮,我可以看到WebView中有一个历史堆栈,我可以看到历史记录网址是正确的,但是当我调用WebView的 goBack()方法时,它显示一个空白页面。

之前有人遇到过这个问题或者给我一些建议吗?

编辑:如果我使用WebView的 loadUrl 方法,则带有覆盖的“后退”按钮可按预期工作。但是为什么....如果我需要手动处理这个,我该如何开始搞乱历史页面?

5 个答案:

答案 0 :(得分:6)

我也遇到了同样的问题。如果我在调用loadDataWithBaseURL时设置了historyUrl参数,我发现问题就消失了。

答案 1 :(得分:1)

在调用goBack()

之前,你应该检查canGoBack()方法是否返回true

答案 2 :(得分:0)

我发现的唯一解决方案是创建一个Stack< String>并手动管理历史记录

答案 3 :(得分:0)

我遇到了同样的问题,我尝试了所有答案,但没有任何帮助(在运行Marshmallow的Nexus 5上测试了所有答案)。 loadDataWithBaseURL解决方案与我无关,因为我使用的是loadUrl

现在,这不是一个解决方案,但我幸运地注意到了这一点。这个东西真的很奇怪,只有当目标网址以.html结尾时才有效。我的目的是帮助任何面临这个问题的人,因为我知道这有多烦人。所以请耐心等待,如果您认为这是无稽之谈,请不要拒绝投票。

我注意到,如果网址以.html结尾,则按下后退按钮时,白色屏幕会显示

另一方面,如果从网址中删除.html - 显然只有当该网站支持时(即重定向并且所有服务器都在服务器端正确处理并且不会触发) 404 Page Not Not Found错误),这次url将充当你的 base ,当你按下后退按钮时,这次白色屏幕不应该出现

例如:你必须更换 http://example.com/page.htmlhttp://example.com/page

同样,我没有在没有经过彻底测试的情况下发布这个内容 - 这对我来说很有用,我很高兴我发现了这一点,我希望它对你也有所帮助。

答案 4 :(得分:0)

我处理这个的方法是在使用loadDataWithBaseURL加载根页面后保留一个本地堆栈指针指向已加载页面的数量。返回时,如果我的指针命中1,则我处于根级别并使用loadDataWithBaseURL重新加载根页。

仅供参考,我在带有片段的活动中使用此代码,因此片段实现了接口IBackButtonListener,它帮助我捕获主活动中的后退按钮并将事件传播到当前片段。如果片段返回true,则表示它已处理该事件。

IBackbuttonListener.java

public interface IBackButtonListener {
    public boolean onBackButtonPressed();
}

实现IBackButtonListener并具有从html数据加载的webview的片段。

    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是一个带有页面' s html的字符串。