我正在将Android应用程序从API 27更新到API 29,我注意到我在尝试在基于5.0和/或5.1的模拟器上呈现WebView时遇到崩溃。此问题不会发生在运行6.0或更高版本(API 23-29)的模拟器上。
我似乎找不到任何会影响5.0或5.1的WebView行为的留档,但我可以确认当我使用API 27运行应用程序时不会发生问题。我不知所措,因为我不知道这是模拟器问题还是实际的API/设备问题(我认为是后者)。
问题是,由于缺少字符串资源,活动和片段根本不会膨胀。下面是一些stacktrace(它似乎找不到字符串资源):
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.MyActivity}: android.view.InflateException: Binary XML file line #15: Error inflating class com.example.MyWebView
Caused by: android.view.InflateException: Binary XML file line #15: Error inflating class com.example.MyWebView...
Caused by: java.lang.reflect.InvocationTargetException...
Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x2040002
在崩溃发生之前,与资源相关的日志中有一些相关的警告:
java prettyprint-override">W/chromium: [WARNING:resource_bundle.cc(315)] locale_file_path.empty()
E/eglCodecCommon: glUtilsParamSize: unknow param 0x000082da
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00008cdf
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00008824
W/chromium: [WARNING:proxy_service.cc(901)] PAC support disabled because there is no system implementation
W/chromium: [WARNING:data_reduction_proxy_settings.cc(403)] SPDY proxy OFF at startup
W/ResourceType: No known package when getting value for resource number 0x02040002
网络视图:
public class MyWebView extends WebView {
public MyWebView (Context context) {
super(context);
initialize();
}
public MyWebView (Context context, AttributeSet attrs) {
super(context, attrs);
initialize();
}
public MyWebView (Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initialize();
}
public MyWebView (Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
initialize();
}
public MyWebView(Context context, AttributeSet attrs, int defStyleAttr, boolean privateBrowsing) {
super(context, attrs, defStyleAttr, privateBrowsing);
initialize();
}
private void initialize() {
this.clearCache(true);
this.clearHistory();
this.getSettings().setJavaScriptEnabled(true);
this.getSettings().setLoadsImagesAutomatically(true);
this.getSettings().setUseWideViewPort(true);
this.getSettings().setAllowContentAccess(false);
this.getSettings().setAllowFileAccess(false);
this.getSettings().setAllowFileAccessFromFileURLs(false);
this.getSettings().setAllowUniversalAccessFromFileURLs(false);
this.getSettings().setDomStorageEnabled(false);
this.getSettings().setAppCacheEnabled(false);
this.getSettings().setDatabaseEnabled(false);
this.getSettings().setGeolocationEnabled(false);
this.getSettings().setSaveFormData(false);
this.getSettings().setSupportMultipleWindows(false);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
this.getSettings().setSafeBrowsingEnabled(false);
}
}
}
布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<com.example.MyWebView
android:id="@+id/my_web_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
你知道我做错了什么,或者API 28或29中有什么可能会打破这一点的变化吗?
在androidx中修复。appcompat:appcompat:1.2.0-alpha02只需更新你的应用程序。gradle带行的文件:
implementation "androidx.appcompat:appcompat:1.2.0-alpha02"
这似乎是appcompat 1.1.0的一个错误-https://issuetracker.google.com/issues/141132133
虽然您可以尝试降级appcompat或等待修复,但您也可以尝试
使用自定义网络视图:
private fun Context.getLollipopFixWebView(): Context {
return if (Build.VERSION.SDK_INT in 21..22) {
createConfigurationContext(Configuration())
} else this
}
/**
* Workaround appcompat-1.1.0 bug https://issuetracker.google.com/issues/141132133
*/
class LollipopFixWebView(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) :
WebView(context.getLollipopFixWebView(), attrs, defStyle)
或者将此解决方法添加到WebView的父活动中:
// Workaround appcompat-1.1.0 bug https://issuetracker.google.com/issues/141132133
override fun applyOverrideConfiguration(overrideConfiguration: Configuration) {
if (Build.VERSION.SDK_INT in 21..22) {
return
}
super.applyOverrideConfiguration(overrideConfiguration)
}
荣誉和荣誉https://github.com/ankidroid/Anki-Android/issues/5507那家伙相信Android7也发生了这种情况,但我无法复制
自定义WebView解决方案可能会带来一个新问题:所有Android版本的键盘都不显示。
因此,我们需要将isFocusable和isFocusableInTouchMode设置为自定义WebView类,以防止此类问题
class LollipopFixWebView : WebView {
constructor(context: Context) : this(context, null)
constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context.getLollipopFixWebView(), attrs, defStyleAttr) {
isFocusable = true
isFocusableInTouchMode = true
}
}
我的minSdk版本是21(Lollipop),所以不能保证我的解决方案适用于minSdk版本更低的应用程序
我经历了同样的麻烦,实际上解决问题的方法是将构造函数中的上下文更改为context.getApplication Context()
。
在此之后,它的建设和渲染没有任何问题的Android5。
问题内容: 我正在开发一个Android应用程序,该程序从MySQL数据库读取数据,但遇到了此错误。我有这个XML布局: 这是我的Java文件: 调用此Activity时,我收到以下错误消息: 我不知道如何解决此错误。 问题答案: 更改 至 有不同的版本-一种采用字符串,一种采用int资源ID。如果将其传递给整数,它将尝试查找相应的字符串资源ID-找不到它,这是你的错误。 我想返回一个整数。你需要
我正在开发一个从MySQL数据库读取数据的Android应用程序,我遇到了这个错误。我有这样的XML布局: 这是我的Java文件: 当调用此activity时,我收到以下错误消息: 我不知道如何修复这个错误。
我仍然不明白错误在哪里,如何恢复它!
我们从Galaxy S6、Android 5.0.2的测试人员那里得到了这个崩溃。Android系统WebView37 (1726107-arm64)Google Play服务19.0.56 (020400-263933554)谷歌应用商店16.5.30-all[0][PR] 267441717 如何复制(除了上述设备): Android Studio,为x86_64api 21和22构建的模拟器
我一直收到同样的撞车报告,扔了一个Android。所容纳之物res.Resources$NotFoundException错误,抱怨缺少资源ID。 谁能解释一下错误是什么吗?我看到一些帖子谈到导航视图(NavigationView)是个问题。其他人提到了v21可绘制资源,但我的应用程序中没有任何v21可绘制资源。 如果你看到过回答这个问题的帖子,请告诉我。否则,我们将不胜感激! 下面是其中一个崩溃