我正在将本地 html 文件的内容加载到 WebView 中:
context?.assets?.open("SeatingPlan.html")?.bufferedReader().use {
val some = it?.readText()
some.let {
val finalHTML = some!!.replace("{PERFORMANCE-ID}", occurrence.id.toString())
binding.webView.addJavascriptInterface(SeatingPlanWebAppInterface { ticketData: String ->
handleTicketSelection(ticketData)
}, "Android")
binding.webView.loadData(finalHTML, "text/html; charset=utf-8", "UTF-8")
}
}
然后,我有一个监听器,以便在加载完成后触发一些 javascript 函数,如下所示:
binding.webView.settings.javaScriptEnabled = true
binding.webView.webViewClient = object : WebViewClient() {
override fun onPageFinished(view: WebView, url: String) {
super.onPageFinished(view, url)
binding.webView.loadUrl("javascript:(function() {" + "document.addEventListener('LTD.SeatPlan.OnSeatSelected', e => {Android.seatSelected(JSON.stringify(e.detail))});" + "document.addEventListener('LTD.SeatPlan.OnSeatUnselected', e => {Android.seatUnSelected(JSON.stringify(e.detail))});" + "})();")
}
}
相同的代码对于我的应用程序的所有受支持的 android 版本(5.0+)都运行良好,而现在,在更新到目标 sdk 29 后,它卡在加载 html 中,而是显示一个空白的白色屏幕。
我认为该问题可能与对
SDK
所做的更改有关。 29 ,但不知道在哪里寻找解决方案。我认为它可能是目标的原因SDK
29 问题是因为与 WebView
相关的最新更改。制作:https://developer.android.com/about/versions/pie/android-9.0-migration .有解决方法吗?
最佳答案
此更改是 behavioral changes 的一部分安卓派 (28)。
但是,令人惊讶的是 WebView
如果 targetSdk
版本设置为 28。当您将其更改为 29 时,它会停止在所有真实设备中工作,但它仍然可以在模拟器中工作。
需要调用静态方法setDataDirectorySuffix在初始化您的 WebView 以使其正常工作之前。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
WebView.setDataDirectorySuffix("your-suffix");
}
关于android - 在更新到目标 sdk 29 之前,Javascript 无法在 Android WebView 上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56848736/