android 현재 WebView에서 외부 페이지 불러오기 / WebView 새창 띄우지 않기 / WebViewClient

2016. 4. 20. 10:08mobile/android

 

WebView 에서 외부 페이지를 불러오려고 loadUrl 함수를 사용했더니 갑자기 외부 브라우저를 실행시킨 적이 있다.

 

WebView 안에서 웹 페이지를 돌아다녀야 하는 경우가 있었다.

 

처음 엑티비티에 로드할 경우에는 문제가 없지만 WebView 상에서 페이지 이동이 일어날 겨우 보통 디바이스의 브라우저로 실행된다.

 

이 경우에는 WebViewClient 의 shouldOverrideUrlLoading 함수를 사용하여 아주 간단하게 해결된다.

쉽게 말해서 loadUrl 로 호출하던 방법을 WebViewClient 에서 대신 호출한다고 생각하면 된다.

 

WebViewClient 에 대해서는 알아두면 좋으니 WebViewClient의 Override 메소드들도 함께 간단하게 살펴보겠다.

 

Override 메소드들은 onPageStarted, onLoadResource, doUpdateVisitedHistory, onPageFinished, onReceivedError, onReceivedHttpAuthRequest, onScaleChanged, shouldOverrideKeyEvent, shouldOverrideUrlLoading 등이 있는데 아래 소스에서 설명한다.

 



 

사용방법이다.

 

먼저 webView에 Client를 연결해 준다.

1
webView.setWebViewClient(new MyWebViewClient());
cs

 

다음으로는 MyWebViewClient 라는 클래스를 생성한다. 물론 WebViewClient를 상속받아야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import android.graphics.Bitmap;
import android.view.KeyEvent;
import android.webkit.HttpAuthHandler;
import android.webkit.WebView;
import android.webkit.WebViewClient;
 
public class MyWebViewClient extends WebViewClient {
 
    // 로딩이 시작될 때
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
    }
 
    // 리소스를 로드하는 중 여러번 호출
    @Override
    public void onLoadResource(WebView view, String url) {
        super.onLoadResource(view, url);
    }
 
    // 방문 내역을 히스토리에 업데이트 할 때
    @Override
    public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) {
        super.doUpdateVisitedHistory(view, url, isReload);
    }
 
    // 로딩이 완료됬을 때 한번 호출
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
    }
 
    // 오류가 났을 경우, 오류는 복수할 수 없음
    @Override
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
        super.onReceivedError(view, errorCode, description, failingUrl);
 
        switch (errorCode) {
            case ERROR_AUTHENTICATION:
                break;               // 서버에서 사용자 인증 실패
            case ERROR_BAD_URL:
                break;                           // 잘못된 URL
            case ERROR_CONNECT:
                break;                          // 서버로 연결 실패
            case ERROR_FAILED_SSL_HANDSHAKE:
                break;    // SSL handshake 수행 실패
            case ERROR_FILE:
                break;                                  // 일반 파일 오류
            case ERROR_FILE_NOT_FOUND:
                break;               // 파일을 찾을 수 없습니다
            case ERROR_HOST_LOOKUP:
                break;           // 서버 또는 프록시 호스트 이름 조회 실패
            case ERROR_IO:
                break;                              // 서버에서 읽거나 서버로 쓰기 실패
            case ERROR_PROXY_AUTHENTICATION:
                break;   // 프록시에서 사용자 인증 실패
            case ERROR_REDIRECT_LOOP:
                break;               // 너무 많은 리디렉션
            case ERROR_TIMEOUT:
                break;                          // 연결 시간 초과
            case ERROR_TOO_MANY_REQUESTS:
                break;     // 페이지 로드중 너무 많은 요청 발생
            case ERROR_UNKNOWN:
                break;                        // 일반 오류
            case ERROR_UNSUPPORTED_AUTH_SCHEME:
                break// 지원되지 않는 인증 체계
            case ERROR_UNSUPPORTED_SCHEME:
                break;          // URI가 지원되지 않는 방식
        }
 
    }
 
    // http 인증 요청이 있는 경우, 기본 동작은 요청 취소
    @Override
    public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {
        super.onReceivedHttpAuthRequest(view, handler, host, realm);
    }
 
    // 확대나 크기 등의 변화가 있는 경우
    @Override
    public void onScaleChanged(WebView view, float oldScale, float newScale) {
        super.onScaleChanged(view, oldScale, newScale);
    }
 
    // 잘못된 키 입력이 있는 경우
    @Override
    public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
        return super.shouldOverrideKeyEvent(view, event);
    }
 
    // 새로운 URL이 webview에 로드되려 할 경우 컨트롤을 대신할 기회를 줌
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
}
cs

 

각 Overrid 함수에 대한 설명은 주석으로 대체한다.

소스에 있는 주석을 보면 알겠지만 Override 되는 함수는 여러개이다. webview를 컨트롤 하기 위해서는 위 함수들이 꽤 유용하게 사용된다. 

하지만 모두 필수는 아니니 필요한 함수들만 상속받아서 사용하면 된다. 모두 적어놓은 이유는 혹시나 필요할 경우 참고하기 위해서 이다.

 



 

다시 본론으로 돌아와서 소스 가장 마지막에 있는 shouldOverrideUrlLoading 에 대해서 살펴본다.

이 함수는 WebView 에 새로운 Url이 로드될려고 할 경우 실행된다.

새로운 Url이 호출 되는 기회를 WebView Client에게 제공하고 여기서 loadUrl 을 사용하여 호출하게되면 WebView에서 로드되게된다. return값을 true로 하면 새로운 Url을 호출하기 위해서 외부 브라우저를 더이상 찾지 않게 된다.