我有一个Android应用程序,它使用WebView加载活动中的网页。我正在使用手动检索页面并使用WebView的 loadDataWithBaseURL 在屏幕上显示它。那里的一切都很好。
现在,我正在尝试覆盖Back按钮按下以模拟返回WebView历史堆栈。我能够覆盖后退按钮,我可以看到WebView中有一个历史堆栈,我可以看到历史记录网址是正确的,但是当我调用WebView的 goBack()方法时,它显示一个空白页面。
之前有人遇到过这个问题或者给我一些建议吗?
编辑:如果我使用WebView的 loadUrl 方法,则带有覆盖的“后退”按钮可按预期工作。但是为什么....如果我需要手动处理这个,我该如何开始搞乱历史页面?
答案 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 ,当你按下后退按钮时,这次白色屏幕不应该出现。
同样,我没有在没有经过彻底测试的情况下发布这个内容 - 这对我来说很有用,我很高兴我发现了这一点,我希望它对你也有所帮助。
答案 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的字符串。