WebView无法打开外部URL新标签页问题排查
问题分析与解决方案
你的代码存在两个核心问题,导致Stripe认证的新页面无法正常加载显示:
1. 无效的提前添加WebView操作
代码开头的webView.addView(newWebView)完全错误——这里的newWebView未初始化,会直接触发空指针异常,且逻辑上毫无意义:新WebView应该在创建窗口的回调里生成后再添加到布局,而非提前无意义地调用。直接删除这行代码。
2. 新WebView未加入视图层级
你在onCreateWindow里创建了新WebView,但仅将其赋值给WebViewTransport,却没有把这个WebView添加到当前Activity的布局容器中。未加入视图层级的WebView不会被系统渲染,自然看不到OTP输入页面,也无法进行交互。
修改后的完整代码示例
webView.settings.setSupportZoom(true) webView.settings.javaScriptEnabled = true webView.settings.offscreenPreRaster = true webView.settings.setSupportMultipleWindows(true) webView.settings.javaScriptCanOpenWindowsAutomatically = true webView.webChromeClient = object : WebChromeClient() { override fun onCreateWindow(view: WebView?, isDialog: Boolean, isUserGesture: Boolean, resultMsg: Message?): Boolean { val newWebView = WebView(requireActivity()) newWebView.settings.setSupportZoom(true) newWebView.settings.loadWithOverviewMode = true newWebView.settings.javaScriptEnabled = true newWebView.settings.offscreenPreRaster = true newWebView.settings.setSupportMultipleWindows(true) newWebView.settings.javaScriptCanOpenWindowsAutomatically = true // 配置布局参数,让新WebView占满屏幕 val params = FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT ) newWebView.layoutParams = params newWebView.webViewClient = object : WebViewClient() { override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) { super.onPageStarted(view, url, favicon) } override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean { val newUrl = request?.url?.toString() val browserIntent = Intent(Intent.ACTION_VIEW) browserIntent.data = Uri.parse(newUrl) startActivity(browserIntent) return true } override fun onReceivedSslError(view: WebView?, handler: SslErrorHandler?, error: SslError?) { handler?.proceed() } } // 将新WebView添加到Activity的根布局中 val rootLayout = requireActivity().findViewById<ViewGroup>(android.R.id.content) rootLayout.addView(newWebView) val transport = resultMsg?.obj as? WebView.WebViewTransport transport?.webView = newWebView resultMsg?.sendToTarget() return true } }
额外优化建议
- 若想让新窗口以弹窗形式展示,可调整
LayoutParams设置宽高为屏幕的80%,并添加背景、圆角等样式。 - 在页面销毁时记得移除动态添加的WebView,避免内存泄漏。
- Stripe认证流程可能需要第三方Cookie支持,可添加配置:
newWebView.settings.allowThirdPartyCookies = true(Android 11及以上需在Manifest中配置相关权限)。
内容的提问来源于stack exchange,提问作者ono
相关产品推荐
相关产品推荐

