我想允许重定向在WebView中自然发生,并且只有在用户点击某些内容时才会发现新的URL。
答案 0 :(得分:19)
我有类似的问题。我需要在我的活动中打开WebView中的页面。但是,当用户点击页面中的链接时,我希望它在“新窗口”中打开,这意味着浏览器活动。如果页面具有重定向,则会出现问题。为了实现这一目标,我做了以下工作:
代码示例:
private boolean mLoaded = false;
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if(mLoaded){ // open in new browser window only if page already finished
try
{
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
activity.startActivity(intent);
}
catch (Exception e)
{
Logger.log(e);
}
}
return true;
}
@Override
public void onPageFinished(WebView webView, String url) {
layoutHoldingTheWebView.setVisibility(View.VISIBLE);
mLoaded = true;
}
}
答案 1 :(得分:10)
我刚刚在SDK中找到了可能有效的内容,WebView.getHitTestResult()如果有人发现此方法存在任何缺陷,请告诉我。
以下是我如何使用它的示例:
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if(view.getHitTestResult().getType() > 0){
// From a user click, handle it yourself.
return true;
} else {
// Nothing clicked, assumed to be a redirect, let it redirect.
return false;
}
}
答案 2 :(得分:8)
不直接,不。
您可以使用WebViewClient.onPageStarted
和WebView.getOriginalUrl
的组合来尝试确定正在显示的网址是否是原始网址,但之后 {{1>已经决定加载Url。这可以帮助确定重定向是否已经发生,但仍然不会区分用户事件和不会导致重定向的脚本事件。
如果您控制网络内容的内容,您还可以以某种可识别的方式对用户可点击的网址进行编码(例如,专有方案而不是http),并且如果您的标准匹配,则执行您需要的任何其他处理WebView
实施。
答案 3 :(得分:2)
在SDK 24中。
可以通过新的shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
,
WebResourceRequest中有一个方法isRedirect()
,用于获取请求是否是服务器端重定向的结果。
答案 4 :(得分:1)
改编自Garrett的答案,因为我发现它并没有像写的那样工作,给出了一些错误等。而且我认为不需要关于可见性的部分。我有与OP完全相同的问题,这给出了我想要的行为:
FloatingActionButton
答案 5 :(得分:-2)
您可以执行以下操作:
@Override
public boolean shouldOverrideUrlLoading(WebView webView, String url) {
if (webView.getUrl() != null && webView.getOriginalUrl() != null && webView.getOriginalUrl().equalsIgnoreCase(webView.getUrl()) {
// Not Redirect
} else {
// Redirect
}
}