在WebView中,有一种方法可以让shouldOverrideUrlLoading确定它是否正在捕获重定向而不是用户单击链接?

时间:2010-10-04 02:05:48

标签: android webview

我想允许重定向在WebView中自然发生,并且只有在用户点击某些内容时才会发现新的URL。

6 个答案:

答案 0 :(得分:19)

我有类似的问题。我需要在我的活动中打开WebView中的页面。但是,当用户点击页面中的链接时,我希望它在“新窗口”中打开,这意味着浏览器活动。如果页面具有重定向,则会出现问题。为了实现这一目标,我做了以下工作:

  1. 我只在页面加载完成后才显示webview。
  2. 我保留一个布尔告诉我页面何时加载完毕。用户交互只能在页面加载完成后发生。否则它是一个重定向,应该在我的活动中打开。
  3. 代码示例:

    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.onPageStartedWebView.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
    }
}