티스토리 뷰

 

먼지가 되고 싶은 한 주의 마무리는... 갑자기 뜨지 않는 앱의 팝업창 대응 되시겠다

"세션 유지가 되어야 하고... 우선 창이 뜨지 않으니... 처리를 좀 해달라.... 빠르게 부탁한다........."

ㅠㅠ

서비스 오픈 전에 제발.부탁.인데 이야기 한 번만 해주세요

테스트를 하고 올려야 할 거 아니에요!!!!!!!!!!!!!!!(스트레스++++++++++++)

 

거두절미 코드

 

1. 웹뷰에서 window.open이 호출되면 이 함수가 호출됨 (should~~는 이 함수 다음에 호출)

  @Override
  public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
            
  }

 

2.  내부에 새로운 웹뷰를 만들자

	WebView newWebView = new WebView(view.getContext());
	WebSettings settings = newWebView.getSettings();

	settings.setJavaScriptEnabled(true);
	settings.setJavaScriptCanOpenWindowsAutomatically(true);
	settings.setSupportMultipleWindows(true);

 

3. 새로운 웹뷰를 띄워 줄 다이얼로그를 만들자

여기서, 다이얼로그 스타일을 지정해준다(풀 스크린, 상태바 색상 등등)

	final Dialog dialog = new Dialog(view.getContext(), R.style.FullScreenDialogStyle);
	dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
	dialog.setContentView(newWebView);
	dialog.show();

 

4. 사용자가 백버튼 눌렀을 때 대응하자

	dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
          @Override
                public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
                    if(keyCode == KeyEvent.KEYCODE_BACK) {
                        if(newWebView.canGoBack()){
                            newWebView.goBack();
                        }else{
                            dialog.dismiss();
                        }
                        return true;
                    }else{
                        return false;
                    }
                }
            });

 

5. 마무리 웹뷰 클라이언트 설정 등

            newWebView.setWebViewClient(new WebViewClient(mContext, mActivity));
            newWebView.setWebChromeClient(new WebChromeClient() {
                @Override
                public void onCloseWindow(WebView window) {
                    dialog.dismiss();
                }
            });

            WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
            transport.setWebView(newWebView);
            resultMsg.sendToTarget();

 

6. 웹에서 팝업창 종료 시 웹뷰도 꺼주기

        @Override
        public void onCloseWindow(WebView window) {
            Log.e(getClass().getName(), "onCloseWindow");
            window.setVisibility(View.GONE);
            window.destroy();
            super.onCloseWindow(window);
        }

 

여기까지 하면 세션 유지된 window.open은 정상 동작 한다.

끝났나? 했는데 페이지 접근 후에 백버튼으로 다이얼로그를 종료했더니. 웹뷰가 남아있다.

정상적으로 웹뷰에서 종료되면 안 남는데...

webview 자체를 destroy해줘야 한다

 

7. 5번 코드 수정

	dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
                @Override
                public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
                    if(keyCode == KeyEvent.KEYCODE_BACK) {
                        if(newWebView.canGoBack()){
                            newWebView.goBack();
                        }else{
                            newWebView.setVisibility(View.GONE);
                            newWebView.destroy();
                            dialog.dismiss();
                        }
                        return true;
                    }else{
                        return false;
                    }
                }
            });

 

 

전체 코드

	@Override
        public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
            WebView newWebView = new WebView(view.getContext());
            WebSettings settings = newWebView.getSettings();
            settings.setJavaScriptEnabled(true);
            settings.setJavaScriptCanOpenWindowsAutomatically(true);
            settings.setSupportMultipleWindows(true);

            final Dialog dialog = new Dialog(view.getContext(), R.style.FullScreenDialogStyle);
            dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
            dialog.setContentView(newWebView);
            dialog.show();
            dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
                @Override
                public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
                    if(keyCode == KeyEvent.KEYCODE_BACK) {
                        if(newWebView.canGoBack()){
                            newWebView.goBack();
                        }else{
                            newWebView.setVisibility(View.GONE);
                            newWebView.destroy();
                            dialog.dismiss();
                        }
                        return true;
                    }else{
                        return false;
                    }
                }
            });
            newWebView.setWebViewClient(new WebViewClient(view.getContext()));
            newWebView.setWebChromeClient(new WebChromeClient() {
                @Override
                public void onCloseWindow(WebView window) {
                    dialog.dismiss();
                }
            });

            WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
            transport.setWebView(newWebView);
            resultMsg.sendToTarget();

            return true;
        }

        @Override
        public void onCloseWindow(WebView window) {
            window.setVisibility(View.GONE);
            window.destroy();
            super.onCloseWindow(window);
        }

 

 

끝.

댓글
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
최근에 올라온 글