반응형
웹뷰에서 window.popup()으로 새 창을 띄우는 코드가 있었는데, 안드로이드 앱에서는 새 창이 안뜨는 현상이 발견됐다.
window.popup() 으로 새 창이 뜨면, 안드로이드 내에서 dialog가 뜨게 하여 새로운 webview를 띄우는 방법으로 해결했다.
popup이 뜨는 것을 감지하는 곳은 webChromClient의 onCreateWindow였다.
webView.webChromeClient = object:WebChromeClient(){
override fun onCreateWindow(
view: WebView?,
isDialog: Boolean,
isUserGesture: Boolean,
resultMsg: Message?
): Boolean {
val popupWebView = WebView(view?.context)
popupWebView.settings.apply {
javaScriptEnabled = true
javaScriptCanOpenWindowsAutomatically = true
domStorageEnabled = true
setSupportMultipleWindows(true)
}
val dialog = Dialog(view.context)
dialog.setContentView(popupWebView)
dialog.show()
dialog.setOnKeyListener { _, keyCode, event ->
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (popupWebView.canGoBack()) {
popupWebView.goBack()
} else {
dialog.dismiss()
popupWebView.destroy() // 팝업 닫힐때 webview destroy
}
true
} else {
false
}
}
popupWebView.webViewClient = WebViewClient()
popupWebView.webChromeClient = object : WebChromeClient() {
override fun onCloseWindow(window: WebView) {
dialog.dismiss()
window.destroy() // 팝업 닫힐때 window destroy
}
}
val transport = resultMsg?.obj as WebView.WebViewTransport
transport.webView = popupWebView
resultMsg.sendToTarget()
return true
}
}
1. onCreateWindow를 오버라이드하여 새로운 webview를 만들어 dialog에 띄웠다.
2. dialog가 닫힐때는 webview destory를 꼭 !!!! 해줘야 한다.
dialog만 닫고, webview destory를 안해주면 다시 window.popup()을 했을때 onCreateWindow가 실행되지 않는다.
** 그밖에 웹뷰 설정
newWebView.settings.apply {
// 컨텐츠 화면에 꽉 차게 표시
loadWithOverviewMode = true
useWideViewPort = true
// 줌 컨트롤 설정
builtInZoomControls = true
displayZoomControls = false
}
'IT > Android' 카테고리의 다른 글
Android / 푸시알림 클릭시 PendingIntent Bundle값 전달 안되는 경우 (0) | 2024.02.07 |
---|---|
Compose / LazyClumn items 리컴포지션 일어나지 않는 경우 (상태변화 감지 안됨) (2) | 2024.02.07 |
android / 안드로이드 webview history back 화면 스크롤 유지 방법 (activity 이동) (0) | 2023.10.20 |
안드로이드 / image crop 라이브러리 사용 (0) | 2023.10.05 |
안드로이드 / android 13 photo picker 사용방법 (0) | 2023.10.05 |