티스토리 뷰
먼지가 되고 싶은 한 주의 마무리는... 갑자기 뜨지 않는 앱의 팝업창 대응 되시겠다
"세션 유지가 되어야 하고... 우선 창이 뜨지 않으니... 처리를 좀 해달라.... 빠르게 부탁한다........."
ㅠㅠ
서비스 오픈 전에 제발.부탁.인데 이야기 한 번만 해주세요
테스트를 하고 올려야 할 거 아니에요!!!!!!!!!!!!!!!(스트레스++++++++++++)
거두절미 코드
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);
}
끝.
'개발 > TIL(Today I Learned)' 카테고리의 다른 글
하이브리드 앱 webview window.open iOS(Swift) 대응 (0) | 2022.02.20 |
---|---|
iOS) Xcode 스토리보드 레이아웃 객체 크기 보기 (0) | 2021.09.30 |
Swift) 카메라 사용 가능 여부 확인하기 (0) | 2021.09.22 |
Swift) 내부 Notification 만들기 (0) | 2021.09.22 |
Swift) Extension UIView (0) | 2021.09.22 |