setWebViewClient와 setWebChromeClient의 차이점은 무엇입니까?


답변:


148

로부터 소스 코드 :

// Instance of WebViewClient that is the client callback.
private volatile WebViewClient mWebViewClient;
// Instance of WebChromeClient for handling all chrome functions.
private volatile WebChromeClient mWebChromeClient;

// SOME OTHER SUTFFF.......

/**
 * Set the WebViewClient.
 * @param client An implementation of WebViewClient.
 */
public void setWebViewClient(WebViewClient client) {
    mWebViewClient = client;
}

/**
 * Set the WebChromeClient.
 * @param client An implementation of WebChromeClient.
 */
public void setWebChromeClient(WebChromeClient client) {
    mWebChromeClient = client;
}

WebChromeClient를 사용하면 Javascript 대화 상자, 즐겨 찾기 아이콘, 제목 및 진행률을 처리 할 수 ​​있습니다. 이 예제를 살펴보십시오 . WebView에 alert () 지원 추가

언뜻보기에 WebViewClientWebChromeClient와의 차이점이 너무 많습니다 . 그러나 기본적으로 : 너무 많은 기능을 필요로하지 않고 HTML을 렌더링하는 WebView를 개발하는 경우을 사용할 수 있습니다 WebViewClient. 반면에 렌더링하려는 페이지의 즐겨 찾기 아이콘을로드하려는 경우 WebChromeClient객체를 사용 하고을 재정의해야합니다 onReceivedIcon(WebView view, Bitmap icon).

대부분의 경우, 그러한 것들에 대해 걱정하고 싶지 않다면 ...이 작업을 수행 할 수 있습니다.

webView= (WebView) findViewById(R.id.webview); 
webView.setWebChromeClient(new WebChromeClient()); 
webView.setWebViewClient(new WebViewClient()); 
webView.getSettings().setJavaScriptEnabled(true); 
webView.loadUrl(url); 

그리고 WebView는 이론적으로 모든 기능을 구현합니다 (Android 기본 브라우저로).


26
이 양식에서는 답이 완전하지 않습니다. ChromeClient를 사용하면 열거 된 것들을 처리 할 수 ​​있지만 ViewClient는 무엇이고 유사점과 차이점은 무엇입니까?
Pentium10

3
이 방법이 기본 웹보기의 일부 나쁜 기능을 개선하는 데 도움이됩니까? 특히 css3 애니메이션 및 전환의 경우?
Ata Iravani

1
두 가지를 동시에 사용할 수 있습니까?
Sergey Dirin

1
@SergeyDirin : stackoverflow.com/a/6475858 . 이 답변을 참조하십시오. 한 번에 둘 다 사용할 수 있습니다.
hoangtu23

크롬이없는 경우 webviewclient에서 카메라 권한을 처리하는 방법은 무엇입니까?
j2emanue

100

이 질문에 좀 더 자세한 내용이 필요하다고 생각합니다. 제 답변은 Android Programming, The Nerd Ranch Guide (2 판)에서 영감을 받았습니다.

기본적 으로 JavaScript는 WebView에서 해제되어 있습니다. 항상 켜져있을 필요는 없지만 일부 앱의 경우 필요할 수 있습니다.

WebView를 구성한 후 URL로드를 수행해야하므로 마지막으로 수행하십시오. 그 전에 getSettings()WebSettings 인스턴스를 얻기 위해 호출하고을 호출 하여 JavaScript를 켭니다 WebSettings.setJavaScriptEnabled(true). WebSettings는 WebView를 수정할 수있는 세 가지 방법 중 첫 번째입니다. 사용자 에이전트 문자열 및 텍스트 크기와 같이 설정할 수있는 다양한 속성이 있습니다.

그런 다음 WebViewClient를 구성하십시오. WebViewClient는 이벤트 인터페이스입니다. 자체 WebViewClient 구현을 제공하여 렌더링 이벤트에 응답 할 수 있습니다. 예를 들어, 렌더러가 특정 URL에서 이미지로드를 시작하는시기를 감지하거나 POST 요청을 서버에 다시 제출할지 여부를 결정할 수 있습니다.

WebViewClient 에는 재정의 할 수있는 많은 메서드가 있으며 대부분은 처리하지 않습니다. 그러나 기본 WebViewClient의 구현을 대체해야합니다 shouldOverrideUrlLoading(WebView, String). 이 방법은 링크를 누르는 것처럼 새 URL이 WebView에로드 될 때 발생하는 상황을 결정합니다. true를 반환하면 "이 URL은 처리하지 말고 직접 처리하는 것입니다."라고 말하는 것입니다. False를 반환하면 "WebView URL을로드하고 아무 작업도하지 않습니다."라고 말합니다.

기본 구현은 이전과 마찬가지로 URL로 암시적인 의도를 발생시킵니다. 그러나 이것은 심각한 문제가 될 것입니다. 일부 웹 응용 프로그램의 첫 번째 작업은 웹 사이트의 모바일 버전으로 리디렉션하는 것입니다. 기본 WebViewClient를 사용하면 사용자의 기본 웹 브라우저로 즉시 전송됩니다. 이것은 당신이 피하려고하는 것입니다. 수정은 간단합니다. 기본 구현을 재정의하고 false를 반환하면됩니다.

WebChromeClient를 사용 하여 문제 해결하기 자신 만의 WebView를 만드는 데 시간이 걸리므로 진행률 표시 줄을 추가하고로드 된 페이지의 제목으로 툴바의 자막을 업데이트하여 조금만 가중 시키십시오.

ProgressBar를 연결하려면 WebView에서 두 번째 콜백을 사용합니다 WebChromeClient.

WebViewClient는 렌더링 이벤트에 응답하기위한 인터페이스입니다. WebChromeClient는 브라우저 주변의 크롬 요소를 변경해야하는 이벤트에 반응하기위한 이벤트 인터페이스입니다. 여기에는 JavaScript 알림, 즐겨 찾기 아이콘 및로드 진행률 및 현재 페이지 제목에 대한 업데이트가 포함됩니다.

에 연결하십시오 onCreateView(…). 진행 업데이트 및 제목 최대 가문비 나무 가지에 WebChromeClient를 사용하여 각각 자신의 콜백 메소드가, 업데이트 onProgressChanged(WebView, int)onReceivedTitle(WebView, String). 받는 진행률 onProgressChanged(WebView, int)은 0에서 100 사이의 정수입니다. 100이면 페이지로드가 완료된 것이므로 가시성을로 설정하여 ProgressBar를 숨 깁니다 View.GONE.

면책 조항 : 이 정보는 저자의 허락을 받아 Android Programming : The Big Nerd Ranch Guide에서 가져온 것입니다. 이 책에 대한 자세한 내용을 보거나 사본을 구입하려면 bignerdranch.com을 방문하십시오.


11
나는 이것이 받아 들인 것보다 더 나은 대답이라고 생각합니다.
redbeam_
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.