(소스는 가장 아래에 첨부해놓겠습니다)
웹뷰로 구성된 액티비티에서 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;
}
});