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

안드로이드 웹뷰에서 팝업 띄웠을 경우 로직에 대해 궁금한점이 있습니다.

0 추천

(소스는 가장 아래에 첨부해놓겠습니다)

웹뷰로 구성된 액티비티에서 window.open() 이 javascript 가 반응하지 않아

구글링을 통해 onCreateWindow 를 오버라이딩하여 새창을 띄우고 안에 팝업내용을 표시하는것까지는 성공을 하였습니다.

문제는 이 다음인데요..

사용자가 백버튼을 누르면 팝업내용이 닫히는데 이게 제 멋대로 동작을 하네요..

onCloseWindow 를 오버라이딩 하였으나 해당 함수까지 가지를 못합니다.

그래서 링크를 눌렀을 때 최초 한번만 반응하고 이후 같은 링크를 클릭하면 창이 안보이는 현상이 나오고 있네요..

제 짧은 지식으로는 새로 띄운 창이 정상적으로 닫히지 않고 숨어버려 

링크를 클릭하면 반응이 없는거 같은데..

(로그캣을 보면 반응이 없다기 보다는 숨겨진 창에서 창이 자꾸 열리고 있는 그런거 같더라구요)

자력으로 해결해 보려 하였으나 도저히 힘들어 이렇게 질문을 남기게 되었습니다. 

선배님들이 보시기에 어디서 제가 잘못 구현했는지요? 

조언을 주시면 감사하겠습니다!

 

webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
                Log.d("확인","새창 띄움 캐치1");

                childView = new WebView(MainActivity.this);
                childView.getSettings().setJavaScriptEnabled(true);
                childView.getSettings().setUserAgentString("Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Mobile Safari/537.36");
                childView.getSettings().setDomStorageEnabled(true);
                childView.setWebChromeClient(this);
                childView.setWebChromeClient(new FullscreenableChromeClient(MainActivity.this));

                childView.setWebChromeClient(new WebChromeClient() {
                    @Override
                    public void onCloseWindow(WebView window) {
                        super.onCloseWindow(window);
                        Log.d("확인","새창 끔 캐치1");
                       /* 이 부분이 캐치가 되지 않네요.. */
                        childCount = 0;
                        //childView.loadUrl("javascript:self.close();");
                        window.removeView(childView);
                    }
                });

                childView.setWebViewClient(new WebViewClient() {
                    @Override
                    public void onPageFinished(WebView view, String url) {
                        super.onPageFinished(view, url);
                        childCount = 1;
                    }

                    @SuppressLint("MissingPermission")
                    @Override
                    public boolean shouldOverrideUrlLoading(WebView view, String url) {
                        if (url.startsWith("tel:")) {
                            Intent call_phone = new Intent(Intent.ACTION_CALL);
                            call_phone.setData(Uri.parse(url));
                            startActivity(call_phone);
                        } else if (url.startsWith("sms:")) {
                            Intent i = new Intent(Intent.ACTION_SENDTO, Uri.parse(url));
                            startActivity(i);
                        } else if (url.startsWith("intent:")) {
                            try {
                                Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
                                Intent existPackage = getPackageManager().getLaunchIntentForPackage(intent.getPackage());
                                if (existPackage != null) {
                                    startActivity(intent);
                                } else {
                                    Intent marketIntent = new Intent(Intent.ACTION_VIEW);
                                    marketIntent.setData(Uri.parse("market://details?id=" + intent.getPackage()));
                                    startActivity(marketIntent);
                                }
                                return true;
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        } else {
                            if (url.startsWith("market")) {
                                startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
                            }else{
                                view.loadUrl(url);
                                Log.d("확인",url);
                            }
                        }

                        return true;
                    }
                });

                childView.setOnKeyListener(new View.OnKeyListener() {
                    @Override
                    public boolean onKey(View v, int keyCode, KeyEvent event) {
                        Log.d("확인","키 : " + keyCode);
                        if (keyCode == KeyEvent.KEYCODE_BACK) {
                            childCount = 0;
                            webView.removeView(childView);
                            return true;
                        }

                        return false;
                    }
                });

                childView.setLayoutParams(new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
                webView.addView(childView);
                WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
                transport.setWebView(childView);
                resultMsg.sendToTarget();

                return true;
            }
       });

 

쿵이 (160 포인트) 님이 2019년 7월 23일 질문
쿵이님이 2019년 7월 23일 수정

1개의 답변

+1 추천
 
채택된 답변
백 키를 눌렀을 때... removeView 하지 마시고

childView.loadUrl("javascript:self.close();"); 를 호출해 보세요.

창이 닫히면서 onCloseWindow() 도 호출 될 거에요.
얼룩얼룩 (890 포인트) 님이 2019년 7월 26일 답변
쿵이님이 2019년 7월 26일 채택됨
이 생각을 못했네요!
해보니 잘 됩니다!
그간 고생한게 허무하게 느껴질정도로 간단했군요... ㅠ
너무 감사합니다!
저도 얼마 전 웹앱을 개발하면서 한참 머리싸맸던 현상이라...
도움이 되었다니 다행이네요~
...