WebView에서 Alert가 동작하지 않을 때

2019. 3. 5. 09:54Programming/Android

반응형

WebView와 WebSettings라는 글에서 알 수 있듯이, 최근에 WebView를 사용한 기능을 추가하는 작업을 진행했다. 버튼을 누르면 WebView가 표시된 Activity를 출력해주고, WebView에서의 작업이 끝나면 기존의 Activity로 돌아가는 기능이었다. 기능을 추가하고났더니 담당자로부터 다시 한 번 메일로 연락이 왔다. 기능이 제대로 동작하지 않는다는 내용이었는데, 무슨 기능인지 다시 문의하고나니 Alert가 출력되지 않는다는 것이었다.

WebViewWebSettings를 이용해서 javascript를 사용하도록 설정하더라도, alert는 동작하지 않는다. alert자체가 Javascript에서 지원하는 게 아니라, 브라우저에서 지원하는 Web API이기 때문인 듯 하다. 다행히도 WebChromeClientalert가 발생했을 시 동작하는 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;
}

위는 WebChromeClientonJsAlert이다. 기본적으로 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을 처리하는 방식들을 보여주고 있다.

참조:




반응형