2019. 3. 5. 09:54ㆍProgramming/Android
WebView와 WebSettings라는 글에서 알 수 있듯이, 최근에 WebView를 사용한 기능을 추가하는 작업을 진행했다. 버튼을 누르면 WebView가 표시된 Activity를 출력해주고, WebView에서의 작업이 끝나면 기존의 Activity로 돌아가는 기능이었다. 기능을 추가하고났더니 담당자로부터 다시 한 번 메일로 연락이 왔다. 기능이 제대로 동작하지 않는다는 내용이었는데, 무슨 기능인지 다시 문의하고나니 Alert가 출력되지 않는다는 것이었다.
WebView
의 WebSettings
를 이용해서 javascript
를 사용하도록 설정하더라도, alert
는 동작하지 않는다. alert
자체가 Javascript
에서 지원하는 게 아니라, 브라우저에서 지원하는 Web API
이기 때문인 듯 하다. 다행히도 WebChromeClient
에 alert
가 발생했을 시 동작하는 onJSAlert
가 있다. 이 메서드를 사용하면 alert
가 발생했을 때, WebView
에서 어떻게 처리할 지 결정할 수 있다.
/**
* Tell the client to display a javascript alert dialog. If the client
* returns true, WebView will assume that the client will handle the
* dialog. If the client returns false, it will continue execution.
* @param view The WebView that initiated the callback.
* @param url The url of the page requesting the dialog.
* @param message Message to be displayed in the window.
* @param result A JsResult to confirm that the user hit enter.
* @return boolean Whether the client will handle the alert dialog.
*/
public boolean onJsAlert(WebView view, String url, String message,
JsResult result) {
return false;
}
위는 WebChromeClient
의 onJsAlert
이다. 기본적으로 false
를 반환한다. 따라서 WebSettings
를 이용해서 WebChromeClient
를 사용하도록 설정하면, javascript
에서alert
를 통해 전달되는 내용이 다이얼로그 형태로 표시된다. 만약 onJsAlert
를 Override하여 메시지를 다른 방식으로 출력하고자 할 경우, onJsAlert
를 Override한 후 return값을 true
로 설정해주면 된다.
WebView mWebView = (WebView)findViewById(R.id.id_web_view);
mWebView.setWebChromeClient(new WebChromeClient(){ // mWebView에 WebChromeClient를 사용하도록 설정한다.
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
return super.onJsAlert(view, url, message, result); // super.onJsAlert는 false를 return한다.
}
});
당연하지만 위에서 Override한 onJsAlert
는 단순히 super.onJsAlert(view, url, message, result)
를 호출하기 때문에, 생략해도 상관없다. 보여주기 위한 코드다. 일반적으로 alert
에 대한 내용을 커스터마이징하지 않는다면, 다음과 같은 결과가 될 것이다.
WebView mWebView = (WebView)findViewById(R.id.id_web_view);
mWebView.setWebChromeClient(new WebChromeClient()); // 기본적으로는 Overriding이 필요없다.
만약 alert
를 다른 방식으로 표현해주기 위해서는, onJsAlert
내부에 표현방식을 구현한 후 return값만 true
로 바꿔주면 된다는 사실을 기억하도록 하자. 참조한 글들에서는 AlertDialog
를 이용해서 표시해주거나, 같은 방식으로 onJsConfirm
을 사용하여 confirm
을 처리하는 방식들을 보여주고 있다.
참조:
- [Android] WebView 사용 시 Javascript Alert, Confirm 출력
- 안드로이드개발 웹뷰에서 경고창(alert)이 반응 없을 때
- JavaScript alert not working in Android WebView, StackOverflow
- [안드로이드] 웹뷰(WebView)에서 자바스크립트 alert 띄우기
- [Android] WebView에서 Javascript Alert 창이 보이지 않을 때
- [Android]WebView 팝업 처리
'Programming > Android' 카테고리의 다른 글
[Android] NavigationMenu에 checkbox/switch 등의 UI 추가하기 (0) | 2019.03.17 |
---|---|
[Android] Parcelable in Kotlin (0) | 2019.03.06 |
[Android/Kotlin] RecyclerView에 Divider 구분선 넣기 (0) | 2019.02.27 |
Android에서 사용하는 단위 정리 (0) | 2019.02.19 |
XML로 커스텀 버튼 만들기 (0) | 2019.02.18 |