public boolean onCreateWindow(WebView view, boolean dialog, boolean userGesture, Message resultMsg)
我在 StackOverflow 找到了一种方法,但它没有获得“window.open('example.com')”url。
Message href = view.getHandler().obtainMessage();
view.requestFocusNodeHref(href);
String url = href.getData().getString("url");
// Only get "<a href='example.com' target='_blank'>" url.
您确定在网络视图的设置中启用了多个窗口吗?:
settings.setSupportMultipleWindows(true)
webChromeClient 在创建新窗口时不会公开所点击链接的 URL。 如果您需要处理点击的 URL,处理 window.open() 情况的唯一方法是通过 webViewClient 的 shouldOverrideUrlLoading,如下所示:
webChromeClient = object : WebChromeClient() {
override fun onCloseWindow(window: WebView?) {
super.onCloseWindow(window)
}
override fun onCreateWindow(
view: WebView?,
isDialog: Boolean,
isUserGesture: Boolean,
resultMsg: Message?
): Boolean {
if (view?.context == null) {
return false
}
if (resultMsg == null) {
return false
}
// Use CustomTabs to open the link when the hitTestResult is not null
if (view.hitTestResult.extra != null) {
val colorParam = CustomTabColorSchemeParams.Builder().setToolbarColor(getColor(context, R.color.nifty_blue)).build()
val intent = CustomTabsIntent.Builder()
.setDefaultColorSchemeParams(colorParam)
.setShowTitle(true)
.build()
intent.launchUrl(view.context, Uri.parse(view.hitTestResult.extra))
return false
}
// Use a new webViewClient to handle window.open() case
val newWebView = WebView(view.context)
newWebView.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(
view: WebView?,
request: WebResourceRequest?
): Boolean {
if (request?.url == null) {
return true
}
val url = request.url.toString()
if (url.contains("example.com")) {
// Here you can handle “example.com” and do whatever you want
return true
}
return true
}
}
val transport = resultMsg.obj as WebView.WebViewTransport
transport.webView = newWebView
resultMsg.sendToTarget()
return true
}
}
对了,别忘了给WebView添加JS设置。
webView.apply {
settings.javaScriptEnabled = true
settings.javaScriptCanOpenWindowsAutomatically = true
settings.setSupportMultipleWindows(true)
}
希望这会有所帮助。