我曾经使用onPageFinished
来跟踪网络视图的历史记录:
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
if ("about:blank".equals(url) && view.getTag() != null){
view.loadUrl(view.getTag().toString());
}else{
view.setTag(url);
}
}
现在,当我尝试view.goBack()
时,它会回到约:空白而不是我想要的页面。
如何设置“about:blank”url以便将其放入webview历史记录中,以便当我回去时我不会再看到它。但我不想要view.clearHistory()
,因为它会删除所有历史记录。
答案 0 :(得分:7)
假设你想要回到历史记录中,直到找到第一个非 about:blank 这是怎么做的:
在您的活动中
public void goBackInWebView(){
WebBackForwardList history = webView.copyBackForwardList();
int index = -1;
String url = null;
while (webView.canGoBackOrForward(index)) {
if (!history.getItemAtIndex(history.getCurrentIndex() + index).getUrl().equals("about:blank")) {
webView.goBackOrForward(index);
url = history.getItemAtIndex(-index).getUrl();
Log.e("tag","first non empty" + url);
break;
}
index --;
}
// no history found that is not empty
if (url == null) {
finish();
}
}
代码逻辑是循环抛出所有以前的页面。并且首先没有空页加载它。 如果没有找到任何完成应用程序。
答案 1 :(得分:0)
我不知道直接编辑历史堆栈的方法,但你可以用shouldOverrideUrlLoading()
来自WebView文档:
WebView有几个自定义点,您可以在其中添加自己的行为。这些是:
...
创建和设置WebViewClient子类。它将在何时被调用 发生的事情会影响内容的呈现,例如错误或 表格提交。 您还可以在此拦截网址加载(通过 shouldOverrideUrlLoading())。
答案 2 :(得分:0)
我发现@ Mr.Me的回答是一个更好的OnKeyListener
public class BackButtonListener implements View.OnKeyListener {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
WebView webView = (WebView) v;
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
WebBackForwardList backstack = webView.copyBackForwardList();
int currentIndex = backstack.getCurrentIndex();
int i = -1;
while (webView.canGoBackOrForward(i)) {
if (!backstack.getItemAtIndex(currentIndex + i).getUrl().equals("about:blank")) {
webView.goBackOrForward(i);
return true;
}
i--;
}
webView.goBack();
return true;
}
}
return false;
}
}
你刚才这样设置:
mWebView.setOnKeyListener(new BackButtonListener());