1. Web-View에 대한 기본적인 세팅
- Web-view를 사용하기 위해서 기본적으로 뷰를 불러왔을때 세팅해줘야 하는 값들이 있다.
1) javascript 실행여부
2) default URL(실행시 켜지는 URL 설정)
3) 웹뷰를 실행할 때 사용할 브라우져 설정 ( 예제에서는 사용자가 지정한 브라우져가 실행되게 되어있다.)
// web-view settings
mWebView.getSettings().setJavaScriptEnabled(true); // java-script ok
mWebView.loadUrl([YOUR_SITE_URL]); // to set first url
mWebView.setWebViewClient(new WebViewClient());// web-view settings on default browser
- 자바스크립트를 사용가능하게 됬을때의 현상
~ 자바스크립트는 외부(웹 사이트의 클라이언트 레이어)에서 오는 내용이 많다.
~ 스크립트로 인해서 안드로이드와 충돌될 가능성이 있다며 Waring을 발산해준다.
~ 무시해도 되는 경고지만 보기 싫으니 @SuppressLint("SetJavaScriptEnabled") 를 추가한다.
※ SuppressLint, Lint tool 이란?
- Lint tool을 언급한 것이 처음이라 간단하게 언급하고 넘어가려고 한다.
- Lint는 프로그래머 입장에서 완벽한 코드이지만, 충돌 가능성이 존재할 것 같다고 IDE가 판단한 것이다.
- 자신의 코드가 더럽혀져 있는 것을 보기싫은 프로그래머는 Lint tool을 이용하여 경고를 없애버린다.
예를들어, min-sdk 이후에 개발된 컴퍼넌트를 사용하게 되는 상황이 있다. 이 경우 프로그래머는 SDK의 버전을 불러와서 예외처리를 해준다. 신/구버전에 대한 체크를 다하였지만, 프로그래머 눈에는 계속 waring이 보이고, 이를 보기 싫은 프로그래머는 Lint Tool을 이용해 버린다.
SuppressLint("NewApi");
위의 경우에는 어플리케이션 내부에서 페이지를 생성하게되면 서로 자바스크립트가 충돌될 가능성이 있기 때문에 경고를 해주는 것이다. 하지만, 어플리케이션 내부에서 페이지를 생성하지 않는 나의 입장에서는 무시할 경고이므로 Lint Tool을 이용해서 경고를 없앴다.
SuppressLint("SetJavaScriptEnabled");
- 이외의 Lint tool에 대한 자세한 내용은 이곳을 클릭해주길 바란다.
2. URL에 대한 Settings
- 위에서 Web-view browser를 선택함과 동시에 URL기반의 웹뷰가 실행되게 된다.
- 사용자가 설정하는 URL을 자신이 원하는 형식으로 다시 변형이 가능한다.
- 이는 WebView 관련 클래스를 상속받아서 확장시키는 개념이다.
~ 일단, 불러주는 browser setting을 자신이 만든 클래스로 변경해준다.
mWebView.setWebViewClient(new WebViewClientClass());// web-view settings on default browser
~ 클래스 내용을 확장시켜준다. 여기서 예를 든 것은 카카오톡과 카카오스토리에 대한 처리이다.
private class WebViewClientClass extends WebViewClient {
// enable KAKAO-Story and KAKAO-Talk share
public static final String KAKAOTALK_PROTOCOL_START = "kakaolink:";
public static final String KAKAOSTORY_PROTOCOL_START = "storylink:";
// market link ( originally : "market://detail? package name", but it is not acted )
public static final String GOOGLE_PLAY_STORE_PREFIX = "http://market.android.com/details?id=";
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith(KAKAOTALK_PROTOCOL_START)) {
try {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
} catch (ActivityNotFoundException e) {
view.loadUrl(GOOGLE_PLAY_STORE_PREFIX + "com.kakao.talk");
}
} else if (url.startsWith(KAKAOSTORY_PROTOCOL_START)){
try {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
} catch (ActivityNotFoundException e) {
view.loadUrl(GOOGLE_PLAY_STORE_PREFIX + "com.kakao.story");
}
} else {
view.loadUrl(url);
}
return true;
}
}
3. back-key 처리
- 어플입장에서 웹뷰는 하나의 Activity에서 계속 작동하므로, 뒤로가기키를 눌렀을 경우 어플이 꺼진다.
- Back-key event가 발생했을 때 웹뷰에서 뒤로가기가 되는지 여부를 판단해주는 행동이 필요하다.
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
mWebView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}