我为后退键实现了android webview和onKeyDown方法。 (它实现了webview.goBack();
)
我的问题与下面这篇文章中的问题完全相似(没有答案)
How to control the Android WebView history/back stack?
问题 - 当我按下后退按钮时,webview
选择以前的URL,但如果该URL实际上是重定向,则会进入此恶性循环/循环。如果您查看chrome或stock浏览器,它可以正确处理后退,而无需返回重定向。
如何解决这个问题?
示例:转到gap.com。然后选择“我的差距信用卡”。这将打开一个重定向链接,然后打开最后一页。现在,当我点击回来时,它永远不会进入Gap.com主页。
任何建议......
其他信息:我确实实施了shouldOverrideUrlLoading
。如果我删除该方法,它似乎工作正常,但使用此方法它不...
答案 0 :(得分:10)
我刚刚在软糖上测试了它,它似乎有效。
基本上,每当在WebView中加载新URL时,请保留该URL的副本。
在下一个网址请求中,仔细检查我们是否已经在此页面上,如果是,请再次返回webview历史记录。
基本上这是依赖于传递到覆盖步骤的url是重定向的url,而不是最终重定向的url。
public class MainActivity extends Activity {
private Button mRefreshButton;
private WebView mWebView;
private String mCurrentUrl;
public void onCreate(Bundle savedInstance) {
super.onCreate(savedInstance);
setContentView(R.layout.main);
mWebView = (WebView) findViewById(R.id.webview);
mRefreshButton = (Button) findViewById(R.id.refresh);
mRefreshButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mWebView.reload();
}
});
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if(mCurrentUrl != null && url != null && url.equals(mCurrentUrl)) {
mWebView.goBack();
return true;
}
view.loadUrl(url);
mCurrentUrl = url;
return true;
}
});
mWebView.loadUrl("http://www.gap.com/");
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(event.getAction() == KeyEvent.ACTION_DOWN) {
switch(keyCode) {
case KeyEvent.KEYCODE_BACK:
if(mWebView.canGoBack()){
mWebView.goBack();
return true;
}
break;
}
}
return super.onKeyDown(keyCode, event);
}
}
答案 1 :(得分:2)
我希望这个答案,如果有人还在寻找它。我一直在寻找修复我的项目中的类似问题,并尝试了多种方法,如使用 - WebView.HitTestResult - 将网址推送到列表中 - onKeyDown等...... 我认为如果您的应用只包含webview,大部分内容都可以使用。但是我的项目结合了原生和webview,并处理了一些原生模式。
基本上发现关键是你如何覆盖方法shouldOverrideUrlLoading。因为我希望我的应用程序处理一些网址和webview来处理其他一些特别是后台处理。我使用了一个标志用于背压等...
@Override
public void onBackPressed() {
if (mWebView.canGoBack()) {
mClient.setIsBackPressed(true);
//mClient is an instance of the MyWebviewClient
mWebView.goBack();
} else {
super.onBackPressed();
}
}
public class MyWebviewClient extends WebViewClient {
private Boolean isBackPressed = false;
public void setIsBackPressed(Boolean isBackPressed) {
this.isBackPressed = isBackPressed;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (isBackPressed){
return false;
}
else {
// handle the url by implementing your logic
return true;
}
}
@Override
public void onPageFinished(WebView view, String url) {
isBackPressed = false;
super.onPageFinished(view, url);
}
}
通过这种方式,当您单击后退时出现重定向时,它将返回false,从而嘲笑Webview的行为。同时,确保在页面加载完成后将isBackPressed设置为false。 希望这会有所帮助!!