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

안드로이드 WebView 고수님들 질문좀요 ㅜㅜ

0 추천

웹뷰 어플을 만들고 있는 왕왕왕초보입니다.

앱을 실행 하면 제가 만든 Custom Webview를 통해 특정 url로 자동 이동하게끔 만들어놨어요.

그 웹사이트에서 이것저것 하다 보면 주소를 입력하는 부분이 있습니다.

아래에 정상적인 시나리오를 쉽게 써볼게요~

1. 앱을 키면 자동으로 특정 웹사이트로 이동한다.
2. 주소 입력하는 화면으로 이동한다.
3. 주소 입력 버튼을 누르면 새 창이 뜬다. (지도창)
4. 지도 내에서 특정 위치를 누르면 새 창은 닫히고, 이전 창의 텍스트 영역에 선택했던 위치의 주소값이 자동으로 입력된다.

그런데 제가 개발한 소스에서는 애초에 3번부터가 제가 개발한 앱에서 실행되는게 아니고, 제가 평소에 즐겨 쓰는 Boat브라우저가 실행이 되네요.

로그로 찍어본 "aaaaaa"는 실행되지만, 창이 닫히는 부분인 "ccccccc"는 Boat브라우저를 back하거나 종료시켜도 실행이 안되네요. "bbbbbb"도 실행 안되구요 ㅠㅠ

제가 만든 앱 말고 크롬이나, 다른 브라우저로 실행하면 저 시나리오대로 잘되요 ㅜㅜ

소스코드 어떤 부분을 수정해야되는지 알려주세요 고수님들 ㅜㅜ

 

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		this.webView = (WebView) findViewById(R.id.webview);
		setWebViewSetting();
		webView.loadUrl(URL_VERSION_1);
	}

	public void setWebViewSetting() {
		webView.setWebViewClient(new WebViewClient());
		webView.setWebChromeClient(new WebChromeClient() {
			@Override
			public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture,
					android.os.Message resultMsg) {

				Toast.makeText(getApplicationContext(), "aaaaaaaaaaaaaaaaaaaaaa", Toast.LENGTH_LONG).show();
				WebView newWebView = new WebView(MainActivity.this);

				newWebView.setWebChromeClient(new WebChromeClient() {
					@Override
					public void onCloseWindow(WebView window) {
						Toast.makeText(getApplicationContext(), "ccccccccccccccc", Toast.LENGTH_LONG).show();
						window.setVisibility(View.GONE);
						webView.removeView(window);
					}
				});
				webView.addView(newWebView);
				WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
				transport.setWebView(newWebView);
				resultMsg.sendToTarget();

				return true;
			};
			
			@Override
			public void onCloseWindow(WebView window){
				super.onCloseWindow(window);
				webView.removeView(window);
			}

			public boolean onJsAlert(WebView view, String url, String message, final android.webkit.JsResult result) {
				Toast.makeText(getApplicationContext(), "bbbbbbbbbbbbbb", Toast.LENGTH_LONG).show();
				new AlertDialog.Builder(MainActivity.this).setTitle("AlertDialog").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;
			};
		});

		WebSettings webSettings = webView.getSettings();
		webSettings.setJavaScriptEnabled(true);

		///
		webSettings.setBuiltInZoomControls(true);
		webSettings.setSupportZoom(true);

		webSettings.setPluginState(WebSettings.PluginState.ON_DEMAND);
		webSettings.setSupportMultipleWindows(true);
		webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
		webSettings.setBlockNetworkImage(false);
		webSettings.setLoadsImagesAutomatically(true);
		webSettings.setUseWideViewPort(true);
		webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
	}

 

껌돌이 (410 포인트) 님이 2016년 8월 18일 질문
껌돌이님이 2016년 8월 18일 수정

1개의 답변

+1 추천
 
채택된 답변
창이 닫길때 ccccccc 는 당연히 실행되지 않습니다.

창을 만든 곳과 같은 레벨 즉 아래에 있는 onCloseWindow 가 실행됩니다.

 @Override

        public void onCloseWindow(WebView window){

            super.onCloseWindow(window);

            webView.removeView(window);

        }
안_드루이드 (14,510 포인트) 님이 2016년 8월 18일 답변
껌돌이님이 2016년 8월 21일 채택됨
아 미처 확인을 하지 못했네요.
 정 안되면 크롬브라우저에서 해당 사이트 테스트 해보세요.
 그리고 WebViewClient, WebChromeClient는 익명클래스로 하지 마시고 밖으로 빼내는게 맞을 것 같습니다.
크롬 브라우저나 기타 다른 브라우저로는 테스트 이상 없이 마쳤어요..(내용에 써놓은 시나리오대로)

그런데 직접 웹뷰를 구현해서 해야되는 상황이라..

궁금한게 있는데,

A화면에 B팝업이 열리게 되어있고

B팝업 화면에서 C팝업이 열리는 형태가 있다면,

저 소스코드는 C팝업이 구현이 안되어있는 상태인가요?
소스를 어떤식으로 변경하셨는지 모르지만, 팝업창이 한개일 경우 문제가 없지만,
팝업창에서 다시 팝업창을 띄울 경우 문제가 있어 보입니다.
A화면은 메인 화면이고
B화면은 location.href 로 열리는 화면이고
C화면은 B화면에서 열리는 팝업인데 window.open 으로 열립니다.

A->B 화면은 제가 만든 웹뷰에서 잘 열리는데 B->C화면을 열때 다른 브라우저 앱이 실행되요.

소스코드는 본문에서 바꾼건 없어요(이전에 밖으로 빼라고 하셔서 onCreate에서 객체 생성하는 식으로 옮겨놨는데 결과는 똑같아요. 아참 부모 ViewGroup에다가 새로운 Webview를 달으라는 것도 그렇게 고쳤어요)

크롬사이트에서 테스트 해보라고 하셨는데, 크롬브라우저랑 기타 다른 마켓에서 다운받은 브라우저에서는 이상 없이 본문에 적은 시나리오대로 움직이네요 ㅠㅠ

코드를 어떻게 고쳐야할까요? ㅠㅠ
자답입니다.

webView.addView(newWebView);  하기 전에
newWebView.setWebViewClient(new WebViewClient()); 코드를 추가하면 됩니다.

물론 안드루이드님께서 말씀주신대로 부모 Layout에 newWebView를 추가해야겠죠

감사합니다!
...