代码之家  ›  专栏  ›  技术社区  ›  James

Android WebView,如何在应用程序中处理重定向而不是打开浏览器

  •  102
  • James  · 技术社区  · 14 年前

    所以现在在我的应用程序中,我访问的URL有一个重定向,当这种情况发生时,WebView将打开一个新浏览器,而不是停留在我的应用程序中。是否有方法可以更改设置,以便视图像正常一样重定向到URL,但留在我的应用程序中而不是打开新浏览器?

    编辑:

    我想要重定向的网址,我只是不知道如何创建它,所以唯一的方法是通过一个将导致重定向到我想要的网址。

    例如:当您转到此处时: http://www.amazon.com/gp/aw/s/ref=is_box_/k=9780735622777 注意它将如何将URL重定向到实际的产品。在我的应用程序中,如果我在一个新浏览器中打开它,它会做得很好,但是如果我在我的应用程序中使用WebView保存它,它会显示为好像在搜索k=9780735622777,如下所示: http://www.amazon.com/gp/aw/s/ref=is_s_?k=k%3D9780735622777&x=0&y=0 . 或者,它将在浏览器中打开视图并显示适当的内容。不过,我想把所有东西都保存在我的应用程序中。

    6 回复  |  直到 11 年前
        1
  •  245
  •   xandy    14 年前

    创建WebViewClient,并覆盖 shouldOverrideUrlLoading 方法。

    webview.setWebViewClient(new WebViewClient() {
        public boolean shouldOverrideUrlLoading(WebView view, String url){
            // do your handling codes here, which url is the requested url
            // probably you need to open that url rather than redirect:
            view.loadUrl(url);
            return false; // then it is not handled by default action
       }
    });
    
        2
  •  19
  •   abbas    9 年前

    documentation ,单击WebView中的任何链接都会启动一个处理url的应用程序,默认情况下,该应用程序是一个浏览器。您需要覆盖这样的默认行为

        myWebView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                return false;
            }
        });
    
        3
  •  13
  •   Till - gotohuman.com    9 年前

    只是添加默认自定义 WebViewClient 会的。这使得WebView可以处理任何加载的url本身。

    mWebView.setWebViewClient(new WebViewClient());
    
        4
  •  7
  •   Ashish Das    8 年前

    必须设置自定义WebviewClient覆盖 应该重写 方法在加载url之前。

    mWebView.setWebViewClient(new WebViewClient()
            {
                @SuppressWarnings("deprecation")
                @Override
                public boolean shouldOverrideUrlLoading(WebView webView, String url)
                {
                    return shouldOverrideUrlLoading(url);
                }
    
                @TargetApi(Build.VERSION_CODES.N)
                @Override
                public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest request)
                {
                    Uri uri = request.getUrl();
                    return shouldOverrideUrlLoading(uri.toString());
                }
    
                private boolean shouldOverrideUrlLoading(final String url)
                {
                    Log.i(TAG, "shouldOverrideUrlLoading() URL : " + url);
    
                    // Here put your code
    
                    return true; // Returning True means that application wants to leave the current WebView and handle the url itself, otherwise return false.
                }
            });
    

    签出用于处理重定向url的示例代码,并在webview中打开PDF而不下载。 https://gist.github.com/ashishdas09/014a408f9f37504eb2608d98abf49500

        5
  •  2
  •   Daniel Nyamasyo    8 年前

    创建一个实现webviewclient的类,并添加以下代码,允许对url字符串进行ovverify,如下所示。 你可以看到这些 example

    public class myWebClient extends WebViewClient {
    
        @Override 
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
             view.loadUrl(url); 
             return true;
         }
    }
    

    在构造函数上,创建一个webview对象,如下所示。

       web = new WebView(this); web.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); 
    

    然后添加以下代码以在应用程序中执行URL加载

           WebSettings settings=web.getSettings(); 
        settings.setJavaScriptEnabled(true); 
    
        web.loadUrl("http://www.facebook.com");
        web.setWebViewClient(new myWebClient()); 
    
     web.setWebChromeClient(new WebChromeClient() {
          // 
          //
        }
    

    Download demo

        6
  •  0
  •   Shalu T D roplacebo    6 年前

    请使用下面的kotlin代码

    webview.setWebViewClient(object : WebViewClient() {
                override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {   
                    view.loadUrl(url)
                    return false 
                }
            })
    

    here