没有重定向的 WebView 返回历史记录
Posted
技术标签:
【中文标题】没有重定向的 WebView 返回历史记录【英文标题】:WebView back history without redirects 【发布时间】:2013-05-22 23:45:01 【问题描述】:我为返回键实现了 android webview 和 onKeyDown 方法。 (它实现了webview.goBack();
)
我的问题与下面这篇文章中的问题完全相似(那里没有答案)
How to control the Android WebView history/back stack?
问题 - 当我按下返回按钮时,webview
选择了前一个 URL,但如果该 URL 实际上是一个重定向,它就会进入这个恶性循环/循环。如果您查看 chrome 或股票浏览器,它会正确处理后面而不返回重定向。
如何解决?
示例:访问 gap.com。然后选择“我的 Gap 信用卡”。这将打开一个重定向链接,然后是最后一页。现在,当我单击返回时,它永远不会进入 Gap.com 主页。
任何建议...
附加信息:我确实实现了shouldOverrideUrlLoading
。如果我删除该方法,它似乎可以正常工作,但使用此方法它不会...
【问题讨论】:
您可以查看 android-browser 的实现方式。 code.google.com/p/android-source-browsing/source/… 但这是一大堆代码。我猜它在BrowserActivity.java
或Controller.java
的某个地方。
***.com/a/24189935/2620328
【参考方案1】:
如果有人仍在寻找它,我希望这个答案。我一直在寻找解决我项目中的类似问题并尝试了多种方法,例如使用 - WebView.HitTestResult - 将网址推送到列表中 - onKeyDown 等等... 如果您的应用程序仅包含 webview,我认为其中大部分都可以工作。但是我的项目结合了原生和 webview 并处理了一些原生模式。
本质上发现关键是你如何覆盖shouldOverrideUrlLoading方法。因为我希望我的应用程序处理一些 url 和 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。 希望这会有所帮助!
【讨论】:
【参考方案2】:我刚刚在 jellybean 上进行了测试,它似乎有效。
基本上,每当在 WebView 中加载新 URL 时,都会保留该 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);
【讨论】:
对我的 onBackPressed() 不起作用。我需要单击两次才能返回上一页以上是关于没有重定向的 WebView 返回历史记录的主要内容,如果未能解决你的问题,请参考以下文章