Android 8(Oreo)WebView中出现Resources$NotFoundException问题
解决Android 8.0 WebView点击下拉框抛出Resources$NotFoundException的问题
这个坑我之前踩过!你遇到的问题是Android 8.0(API 26)对WebView原生下拉控件的行为做了变更导致的——当网页里的<select>下拉框唤起系统原生弹窗时,因为主题资源没有正确初始化,就会抛出Resource ID #0x0的找不到资源异常,而低版本系统没有这个限制所以运行正常。
下面是几个亲测有效的解决方案:
1. 修正WebView所在Activity的主题
Android 8.0开始,WebView的原生弹窗依赖系统主题的相关资源,如果你的Activity主题脱离了系统基础主题,就容易出现资源缺失。
- 确保Activity的主题继承自
Theme.AppCompat或Theme.MaterialComponents系列,比如在AndroidManifest.xml中修改:<activity android:name=".YourWebViewHostActivity" android:theme="@style/Theme.AppCompat.Light.NoActionBar"> </activity> - 如果需要自定义主题,也要保证包含弹窗相关的必要属性:
<style name="CustomWebViewActivityTheme" parent="Theme.AppCompat.Light"> <item name="android:alertDialogTheme">@style/Theme.AppCompat.Light.Dialog.Alert</item> </style>
2. 显式设置WebView的弹窗主题
API 26新增了WebSettings.setPopupWindowTheme()方法,我们可以通过这个方法强制指定WebView弹窗使用的主题,避免系统找不到资源:
WebView webView = findViewById(R.id.your_webview); WebSettings webSettings = webView.getSettings(); // 只在Android 8.0及以上版本生效 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { webSettings.setPopupWindowTheme(R.style.Theme_AppCompat_Light); }
3. 替代方案:改用网页端自定义下拉组件
如果上面的系统级方案都不生效,可以联系网页开发者,把原生的<select>标签替换成网页自定义的下拉UI(比如用JS/CSS实现的模拟下拉框)。这样就不会唤起系统原生弹窗,从根源上规避这个资源问题,同时还能实现更统一的跨端样式。
按照上面的方法调整后,在Android 8.0设备上测试点击下拉框,应该就不会再出现崩溃了,而且低版本的兼容性也不会受影响。
内容的提问来源于stack exchange,提问作者Mayur_Thakur
相关产品推荐
相关产品推荐

