安卓:WebView的方法goBack()显示空白页面

11

我有一个安卓应用程序,在一个带有WebView的活动中加载网页。我手动检索页面并使用WebView的loadDataWithBaseURL方法将其显示在屏幕上,一切都很好。

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

之前有人遇到过这个问题吗?或者给我一些建议如何从这里继续进行?

编辑: 如果我使用WebView的loadUrl方法,那么带有覆盖的“返回”按钮就可以正常工作了。但是为什么呢?如果我需要手动处理此问题,我该如何开始处理历史页面?

5个回答

6

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


参数名称最近更改为 failUrl - ohhorob
2
我们应该在historyUrl中设置什么值? - Saurabh Pareek
我尝试将historyUrl设置为html/urls/wathever,但没有成功...有人成功过吗? - miniBill
1
我在historyUrl参数中复制了URL,问题就解决了。谢谢! - Gena Batsyan
谢谢。在浏览了数十页后,我找到了最佳答案。我将historyUrl指向我的webview主页(我从中下载html页面的第一个url作为字符串),然后它开始在Android 10+版本中无任何问题地工作,否则它只能在Android 23+中工作。 - mifthi

1

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


1
我已经在检查它了。根据我在上面问题描述中的内容,我也能够获取历史URL(之前的页面)。当我执行goBack时,它显示一个空白页面。 - Bundeeteddee

0
我注意到的是,如果URL以.html结尾,当按下返回按钮时,会出现那个白屏。

另一方面,如果你从URL中删除了.html - 显然只有在该网站支持此操作(即服务器端正确处理重定向并且不触发404页面未找到错误)时,该URL将作为您的基础,这时再按返回按钮,那个白屏就不应该再出现了。

例如:你需要将 http://example.com/page.html 替换为: http://example.com/page


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

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是一个包含页面HTML的字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接