이 글의 요약 

-  원하는 URL 만 웹뷰로 보여주고, 나머지는 모바일 브라우저를  새창으로 띄우고 싶을때 



webView = (WebView) findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("http://www.html5rocks.com/");

안드로이드에 webview 를 추가한후에 이것만 코딩한후에  실행시켜보면 , 의도와는 다르게 

앱 내부의 webview 에서 페이지가 뜨는것이아니라, 외부 브라우저를 통해서 띄우려고 할것인데..

이벤트가 일어나는 순서는 :

  1. WebView 는 리모트서버로부터 원래  URL 로딩을 시도하고, 새로운  URL 로 리다이렉트를 갖는다.
  2. WebView 는 시스템이 URL 에 대해 뷰 인텐트를 핸들링할수있는지 체크하고 만약 그렇다면 시스템은 URL 네비게이션을 핸들링한다. 그렇지 않으면  웹뷰는 내부적으로 네비게이트할것이다. (즉, 디바이스에 브라우저가 없다면)
  3. 시스템은 사용자의 http:// URL 을 핸들링할수있는 더 나은 어플리케이션을 선택한후 (즉, 사용자 디폴트 브라우저) 만약, 브라우저가 많으면 아래처럼 선택창을 띄운다.

browser selection dialog

만약 , 어플리케이션의 내부의 웹뷰를 통해서 보고싶으면 WebView 로 부터의 다양한 이벤트를 핸들링할수있 WebViewClient 를 오버라이딩해야한다. 

아래 같은 기본 WebViewClient 구현은 웹뷰에서 어떤 URL 이나 열수있게 한다.

// 브라우저 대신해 WEBVIEW 로 열기위해 강제로 링크하고 리다이렉트한다.

webView.setWebViewClient(new MyAppWebViewClient());

public class MyAppWebViewClient extends WebViewClient {

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url){
         return false;
}
}


return true 로 하면 처리하지 않는다. (웹뷰에 아무것도 나타나지 않음) 


그럼 다른 싸이트 말고, 원하는 싸이트만 열수있게 하려면 어떻게 해야하는가?

shouldOverrideUrlLoading  메소드를 오버라이딩하면 된다. 

아래와 같이 코드를 추가해보자.


  1. public class MyAppWebViewClient extends WebViewClient {
            
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                if(Uri.parse(url).getHost().endsWith("html5rocks.com")) {
                    return false;
                }
                 
                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                view.getContext().startActivity(intent);
                return true;
            }
        }

    URL 이 html5rocks.com 으로 끝나는것은 내부 웹뷰에서 처리한다는 뜻이다.  리턴 false 는 그 자신이 처리한다는 뜻이고, 만약 다른 URL 이라면 새로운 안드로이드 Intent 를 사용해서 새로운 액티비티 (설치된 모바일 브라우저) 를 호출하게된다.



레퍼런스 :

https://developer.chrome.com/multidevice/webview/gettingstarted  

Posted by [前草] 이승현 (wowlsh93@gmail.com)