Android WebView 개발(3) - WebView Client와 WebChromeClient의 사용

  • 1.선언
  • 2.WebViewClient 클래스
  • 2.1 WebViewClient 역할:
  • 2.2 WebViewClient의 일반적인 방법:
  • 2.2.1 shouldOverrideUrlLoading () 방법
  • 3.WebChromeClient 클래스
  • 3.1 WebChromeClient 역할:
  • 3.2 WebChromeClient 일반 방법:
  • 1. 앞말
    앞의 두 편에서 우리는 안드로이드 웹뷰 개발(一) - 웹뷰의 사용 소개를 설명했다.Android WebView 개발(二) - WebSettings 사용 상해;알고 싶은 건 가봐도 돼.오늘은 WebView가 개발한 세 번째 편 - WebView Client와 WebChromeClient의 사용이다.
    2. WebViewClient 클래스
    2.1 WebViewClient 역할:
    WebViewClient는 주로 요청 이벤트를 처리하고 적당한 시기에 리셋하여 논리적으로 처리하는 데 쓰인다
    2.2 WebViewClient의 일반적인 방법:
    2.2.1 shouldOverrideUrlLoading() 방법
    1. 역할:
    /**
         * Give the host application a chance to take over the control when a new
         * url is about to be loaded in the current WebView. If WebViewClient is not
         * provided, by default WebView will ask Activity Manager to choose the
         * proper handler for the url. If WebViewClient is provided, return true
         * means the host application handles the url, while return false means the
         * current WebView handles the url.
         * This method is not called for requests using the POST "method".
         *
         * @param view The WebView that is initiating the callback.
         * @param url The url to be loaded.
         * @return True if the host application wants to leave the current WebView
         *         and handle the url itself, otherwise return false.
         * @deprecated Use {@link #shouldOverrideUrlLoading(WebView, WebResourceRequest)
         *             shouldOverrideUrlLoading(WebView, WebResourceRequest)} instead.
         */

    만약에 WebView Client 실례를 설정하지 않았다면 시스템의 기본 브라우저가 url을 처리할 것이다. 만약에 WebView Client를 설정하고 이 방법이true로 되돌아오면 응용 프로그램이 이 url을 처리하도록 한다. 내 실천에 따르면 이 url을 다시 불러오지 않을 것이다.false를 되돌려주면 현재 웹뷰에서 URL을 처리하도록 합니다.이렇게 보면 이 모델은 이벤트 메커니즘과 매우 유사하고 책임 체인 모델이다. 만약에 당신이 WebView 클라이언트가 처리하고 싶지 않다면 사건을 WebView에 전달하고 WebView의 처리 방식은 불러오는 것이다.또한should Override Url Loading 자체의 반환값이false라는 것을 알 수 있다. 즉, 이 방법을 사용자 정의할 필요가 없다. 원생적인WebView 클라이언트의 실례를 WebView에 전달하면 WebView가 모든 a 링크를 처리하는 것을 즐겁게 할 수 있다!6.0 이후 should Override Url Loading(WebView view, String url)이 버려졌으니 should Override Url Loading(WebView view, WebResource Request request)으로 대체하십시오.
    2.should Override Url Loading () 은 실제 일상 개발에 응용되고 있으며, 우리가 가장 자주 사용하는 것은 should Override Url Loading () 을 다시 써서 웹 페이지를 불러오는 것이지, 제3자 브라우저를 열어 웹 페이지를 불러오는 것이 아니다.코드도 간단합니다.
     webView.setWebViewClient(new WebViewClient(){
          @Override
          public boolean shouldOverrideUrlLoading(WebView view, String url) {
              view.loadUrl(url);
          return true;//       ,      ,         
          }
      });

    또 하나는 서버의 방향을 바꾸는 것을 판단하는 데 자주 사용된다. 우리는 개발 과정에서 웹뷰를 열어 처음에 정상적으로 열었다가 뒤에 다른 페이지로 뛰어가서 열리지 않는다는 것을 보여준다.공식적으로 새api에서 url의 방향을 바꿀 수 있는 방법을 제시했습니다.버전 차이로 모든 안드로이드 버전에 적합한 코드가 여기에 붙습니다.
    다음 두 가지 방법을 다시 쓰다
               /**
                 * android 6.0     
                 * @param view
                 * @param url
                 * @return
                 */
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    if (null == view || TextUtils.isEmpty(url))
                        return false;
    
    
                    WebView.HitTestResult hitTestResult = view.getHitTestResult();
                    boolean isRedirect = !TextUtils.isEmpty(url) && hitTestResult.getType() == WebView.HitTestResult.UNKNOWN_TYPE && hitTestResult.getExtra() == null;
                    if (isRedirect && !url.equals(wapUrl)) {  //wapUrl      url
                        return true;
                    }
    
                    return super.shouldOverrideUrlLoading(view, url);
    
                }
    
                /**
                 * android 7.0     
                 * @param view
                 * @param request
                 * @return
                 */
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                    if (null == view || TextUtils.isEmpty(request.getUrl().toString()))
                        return false;      
                    if (request.isRedirect() && !request.getUrl().toString().equals(wapUrl)) {
                            return true;  //wapUrl      url
                    }
                    return super.shouldOverrideUrlLoading(view, request);
                }
            });

    그러나 구체적인 상황은 구체적으로 분석해야 한다. 복귀true와false의 차이만 알면 된다.
    3. onPageStarted (): 역할: 페이지 호출을 불러오기 시작하면 loading 페이지를 설정하여 네트워크 응답을 기다리고 있음을 알려 줍니다.
     webView.setWebViewClient(new WebViewClient(){
          @Override
          public void  onPageStarted(WebView view, String url, Bitmap favicon) {
             //         
          }
      });

    4.onPageFinished():
    역할: 페이지 불러오기가 끝날 때 호출합니다.loading 줄을 닫고 프로그램 동작을 전환할 수 있습니다.
      webView.setWebViewClient(new WebViewClient(){
          @Override
          public void onPageFinished(WebView view, String url) {
             //         
             //  js          
          }
      });

    5.onReceivedError(): 역할: 페이지를 로드하는 서버에 오류가 발생할 때(예: 404) 호출합니다.
    앱에서 웹뷰 컨트롤을 사용할 때 404와 같은 오류가 발생했을 때 브라우저에 있는 오류 알림 페이지도 보기 흉해 보인다. 그러면 우리 앱은 로컬 오류 알림 페이지를 불러와야 한다. 즉, 웹뷰가 로컬 페이지를 불러오는 방법이다.
    //  1:   html  (error_handle.html),                
    //  2:  html           assets    
    
    //  3:  WebViewClient onRecievedError  
    //         ,                   
        webView.setWebViewClient(new WebViewClient(){
          @Override
          public void onReceivedError(WebView view, int errorCode, String description, String failingUrl){
    switch(errorCode)
                    {
                    case HttpStatus.SC_NOT_FOUND:
                        view.loadUrl("file:///android_assets/error_handle.html");
                        break;
                    }
                }
            });

    6.onReceivedSslError(): 역할:https 요청을 처리하는 웹뷰는 기본적으로 https 요청을 처리하지 않으며 페이지가 공백으로 표시되며 다음과 같은 설정이 필요합니다.
    @Override
                public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                    if (error.getPrimaryError() == SslError.SSL_INVALID) {
                        handler.proceed();
                    } else {
                        handler.cancel();
                    }
                }

    3. WebChromeClient 클래스
    3.1 WebChromeClient 기능:
    역할: WebView에서 자바스크립트를 처리하는 대화상자, 사이트 아이콘, 사이트 제목 등을 보조합니다.
    3.2 WebChromeClient의 일반적인 방법:
    1. onProgressChanged (): 역할: 웹 페이지의 불러오는 진도를 얻고 표시합니다.
     private class MyWebChromeClient extends WebChromeClient {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                super.onProgressChanged(view, newProgress);
    
                if (newProgress == 100) {
                    loadProgress.setVisibility(GONE);//ProgressBar
                    return;
                }
    
                if (loadProgress.getVisibility() == GONE) {
                    loadProgress.setVisibility(VISIBLE);
                }
                loadProgress.setProgress(newProgress);
            }
        }

    WebView Client와 WebChromeClient의 사용은 여기까지입니다.

    좋은 웹페이지 즐겨찾기