개발 프로세스/Back-end
[Android Studio] 안드로이드 하이브리드앱 만들기 3: 웹뷰 자바스크립트 동작 처리하기
slowreem
2021. 8. 24. 15:49
웹뷰에 자바스크립트 alert와 confirm 동작이 작동하도록 코드를 추가한다.
1. MainActivity 자바 클래스에 alert와 confirm 동작 관련 코드를 추가한다.
새로 추가되는 코드
mWebView.setWebChromeClient(new WebChromeClient() {
//alert 처리
@Override
public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
new AlertDialog.Builder(view.getContext())
.setTitle("알림")
.setMessage(message)
.setPositiveButton(android.R.string.ok,
new AlertDialog.OnClickListener(){
public void onClick(DialogInterface dialog, int which) {
result.confirm();
}
})
.setCancelable(false)
.create()
.show();
return true;
}
//confirm 처리
@Override
public boolean onJsConfirm(WebView view, String url, String message,
final JsResult result) {
new AlertDialog.Builder(view.getContext())
.setTitle("알림")
.setMessage(message)
.setPositiveButton("Yes",
new AlertDialog.OnClickListener(){
public void onClick(DialogInterface dialog, int which) {
result.confirm();
}
})
.setNegativeButton("No",
new AlertDialog.OnClickListener(){
public void onClick(DialogInterface dialog, int which) {
result.cancel();
}
})
.setCancelable(false)
.create()
.show();
return true;
}
});
MainActivity 전체 코드 : 이 코드를 그대로 다시 덮어씌우면 된다.
package com.example.carbondiet;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
WebView mWebView;
TextView errorView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//에러메시지 내보낼 텍스트뷰
errorView = (TextView) findViewById(R.id.net_error_view);
//웹페이지
mWebView = (WebView) findViewById(R.id.activity_main_webview);
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
//네트워크연결에러
@Override
public void onReceivedError(WebView view, int errorCode,String description, String 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가 지원되지 않는 방식
}
super.onReceivedError(view, errorCode, description, failingUrl);
mWebView.setVisibility(View.GONE);
errorView.setVisibility(View.VISIBLE);
}
});
mWebView.setWebChromeClient(new WebChromeClient() {
//alert 처리
@Override
public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
new AlertDialog.Builder(view.getContext())
.setTitle("알림")
.setMessage(message)
.setPositiveButton(android.R.string.ok,
new AlertDialog.OnClickListener(){
public void onClick(DialogInterface dialog, int which) {
result.confirm();
}
})
.setCancelable(false)
.create()
.show();
return true;
}
//confirm 처리
@Override
public boolean onJsConfirm(WebView view, String url, String message,
final JsResult result) {
new AlertDialog.Builder(view.getContext())
.setTitle("알림")
.setMessage(message)
.setPositiveButton("Yes",
new AlertDialog.OnClickListener(){
public void onClick(DialogInterface dialog, int which) {
result.confirm();
}
})
.setNegativeButton("No",
new AlertDialog.OnClickListener(){
public void onClick(DialogInterface dialog, int which) {
result.cancel();
}
})
.setCancelable(false)
.create()
.show();
return true;
}
});
mWebView.loadUrl("http://3.34.253.8/");
}
}
<참고>
https://playgroundblog.tistory.com/336
뒤로 버튼 눌렀을때 동작 처리하기 - 안드로이드 모바일웹으로 하이브리드앱 만들기 7
웹뷰에서는 뒤로 가기를 눌렀을때 이전 페이지로 가지 않고, 앱이 닫혀 버리는 현상이 발생 합니다. 이를 위해서 별도의 처리를 해줘야 합니다. 1. MainActiviey 자바 클래스에서 다음을 추가 해줍니
blog.work6.kr