Android WebView 개발(3) - WebView Client와 WebChromeClient의 사용
11980 단어 Android 애플리케이션 레이어WebView
앞의 두 편에서 우리는 안드로이드 웹뷰 개발(一) - 웹뷰의 사용 소개를 설명했다.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의 사용은 여기까지입니다.