
本文档旨在解决 Android WebView 中 `onCreateWindow` 方法无法直接获取 `window.open()` 打开的新窗口 URL 的问题。通过重写 `WebViewClient` 的 `shouldOverrideUrlLoading` 方法,并结合 `WebChromeClient` 的 `onCreateWindow` 方法,提供了一种可靠的方案来捕获和处理新窗口的 URL,并提供了示例代码和配置说明。
在 Android WebView 开发中,WebChromeClient 的 onCreateWindow 方法用于处理 JavaScript 的 window.open() 调用,创建新的 WebView 窗口。然而,onCreateWindow 方法本身并不直接暴露新窗口的 URL。本文将介绍如何通过结合 WebChromeClient 和 WebViewClient 来获取并处理新窗口的 URL。
核心思路是利用 WebViewClient 的 shouldOverrideUrlLoading 方法拦截新窗口的 URL 请求。当 window.open() 被调用时,新的 WebView 会尝试加载 URL,此时 shouldOverrideUrlLoading 方法会被触发,从而可以获取到 URL。
以下是具体的实现步骤:
首先,确保 WebView 启用了 JavaScript,并允许 JavaScript 打开新窗口,同时支持多窗口。
webView.apply {
settings.javaScriptEnabled = true
settings.javaScriptCanOpenWindowsAutomatically = true
settings.setSupportMultipleWindows(true)
}在 onCreateWindow 方法中,创建一个新的 WebView,并设置自定义的 WebViewClient。
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.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
}
}在自定义的 WebViewClient 中,重写 shouldOverrideUrlLoading 方法。在该方法中,可以获取到新窗口的 URL,并进行相应的处理。
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")) {
// 在这里处理包含 "example.com" 的 URL
// 例如,打开一个新的 Activity 显示该 URL
return true
}
return true
}
}通过结合 WebChromeClient 的 onCreateWindow 方法和 WebViewClient 的 shouldOverrideUrlLoading 方法,可以有效地获取并处理 Android WebView 中 window.open() 打开的新窗口 URL。这种方法简单易用,可以满足大多数场景的需求。在实际应用中,需要根据具体情况进行调整和优化,以确保安全性和性能。
以上就是获取 Android WebView 新窗口 URL 的正确方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号