마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 웹뷰 팝업 onclose 관련 질문

0 추천

안녕하세요 질문은 처음올리네요.

현재 하이브리드 기반으로 개발을 하고 있는데,

WebView를 사용해서 하고 어떻게 팝업까지는 띄웠습니다.

하지만 WebViewClient에서 onclose를 수신을 못하는지 종료가 되지 않습니다.

4.4 kitkat 뒤로 자바스크립트를 구현하는데에 방법이 바뀌었다는데 이해를 못하겠네요 ㅠㅠ

public class WebChromeClientClass extends WebChromeClient{

		/*		private Context ctx;
		public WebChromeClientClass(Context context){
			ctx=context;
		}*/
		@Override
		public boolean onCreateWindow(WebView view, boolean dialog,boolean userGesture, Message resultMsg) {
			// TODO Auto-generated method stub

			
			
			//////////////////////DLG/////////////////////////////////

			popdlg = new Dialog(view.getContext());
			popdlg.requestWindowFeature(Window.FEATURE_NO_TITLE);
			popdlg.setContentView(R.layout.activity_popupwebview);
			newWeb=(WebView)popdlg.findViewById(R.id.popup_webview);

			final WebSettings settings = newWeb.getSettings();
			settings.setJavaScriptEnabled(true); 
			settings.setSupportMultipleWindows(false);
			newWeb.setWebChromeClient(mWebChrome);
			newWeb.setWebViewClient(mWebViewClient);//{
			WebView.WebViewTransport transport = (WebView.WebViewTransport)resultMsg.obj;
			transport.setWebView(newWeb); 
			resultMsg.sendToTarget();
			popdlg.setCancelable(false);
			popdlg.show();
			Window window=popdlg.getWindow();
			window.setLayout(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
			Log.i("Dialog Create", "Dialog Create");
			return true;
			//////////////////////DLG/////////////////////////////////
		}
		public void onCloseWindow(WebView window){
			Log.i("Window Close", "Window Close");
			//if(m_bpopup){
				popdlg.dismiss();
				
				mBackground.setVisibility(View.GONE);			
				super.onCloseWindow(window);
				m_bpopup=false;
			//}
		}

		/*@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;
		}

		@Override
		public boolean onJsConfirm(WebView view, String url, String message,
				final JsResult result) {
			new AlertDialog.Builder(view.getContext())
			.setTitle("알림")
			.setMessage(message)
			.setPositiveButton("확인",
					new AlertDialog.OnClickListener(){
				public void onClick(DialogInterface dialog, int which) {
					result.confirm();
				}
			})
			.setNegativeButton("취소", 
					new AlertDialog.OnClickListener(){
				public void onClick(DialogInterface dialog, int which) {
					result.cancel();
				}
			})
			.setCancelable(false)
			.create()
			.show();
			return true;
		}
	}

	private class WebViewClientClass extends WebViewClient{
		public boolean shouldOverrideUrlLoading(WebView view, String url){


			if(url.startsWith("tel:")){				
				Intent call_phone = new Intent(Intent.ACTION_CALL , Uri.parse(url));			
				startActivity(call_phone);
				return true;
			}
			else{
				view.loadUrl(url);
				//Log.i("Page Context", view.getContext().toString());
				return false;
			}
		}

		public void onReceivedHttpAuthRequest(WebView view,HttpAuthHandler handler, String host, String realm){
			super.onReceivedHttpAuthRequest(view, handler, host, realm);
		}
		public void onPageStarted(WebView view, String url, Bitmap favicon) {

			showDialog(0);
		}
		public void onPageFinished(WebView view, String url) {
			
			dismissDialog(0);

		}
		public void onFormResubmission(WebView view, Message dontResend, Message resend){
			resend.sendToTarget();
		}
		public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
			view.loadData("<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>" +
					"</head><body>"+" ("+errorCode+")" + description+"</body></html>", "text/html", "utf-8");	    	
		}
	}

소스는 보시는 바와 같이

page Load 및 자바스크립트 수신을 위해 WebViewClient 와

각종 알럿 창과, create, close를 위해서 WebChromeClient를 재정의해서 사용 중입니다.

현재 문제 사항은

새창까지는 화면에 뜨지만, 해당 창에서 화면이 종료되는 버튼을 누르면

alert 창이 한번 뜨고선 먹통이 되버립니다.

4.4 버전 이하에서는 정상적으로 동작하는 거보면 

4.4 버전 이상부터 바뀐 evaluateJavascript 을 사용해야할거 같은데

제가 자바스크립트에 문외한이라 전혀 모르겠네요 

능력자님들의 도움을 요청합니다 !

(2틀넘게 소스를 들여다 보고 있는데 해결을 못하고 있어요 ㅠㅠ)

TalQ (140 포인트) 님이 2015년 5월 27일 질문
아 추가적으로 Oncreatewindow에서 생성된 dialog가 떠있는 도중,
Alert 창이 떴다가 사라지면 생성된 다이얼로그가 먹통이 됩니다.

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...