11

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

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

有没有人遇到过这个问题,或者给我一些建议以继续这个问题?

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

4

5 回答 5

6

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

于 2010-11-27T21:17:36.300 回答
1

您应该在调用 goBack() 之前检查 canGoBack() 方法是否返回 true

于 2010-08-26T16:32:48.710 回答
0

我找到的唯一解决方案是创建一个 Stack<String> 并手动管理历史

于 2012-03-16T12:20:18.367 回答
0

我处理这个问题的方法是在使用loadDataWithBaseURL. 返回时,如果我的指针命中 1 我处于根级别并使用 .reload 重新加载根页面 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 是一个带有页面 html 的字符串。

于 2017-04-01T18:19:43.733 回答
0

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

现在,这不是一个解决方案,但我幸运地注意到了这一点。这件事真的很奇怪,只有在目标 url 以.html. 我的目的是帮助任何面临这个问题的人,因为我知道这有多烦人。所以请多多包涵,如果您认为这是无稽之谈,不要对这个答案投反对票。

我注意到的是,如果 url 以 结尾,则按下后退按钮时会出现.html该白屏。

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

例如:您必须将 http://example.com/page.html替换为: http ://example.com/page

再一次,我不会在没有彻底测试的情况下发布这个 - 这对我今天有用,我很高兴我找到了这个,我希望它也能帮助你。

于 2016-12-12T13:29:36.870 回答