android.view.InflateException Error inflating class android.webkit.WebView
If you use androidx.appcompat:appcompat:1.1.0
, try androidx.appcompat:appcompat:1.0.2
instead.
it seems that 1.1.0
doesn't fix the bug with WebView
in Android 5.1.1
.
Feb-2020 update: Reverting to 1.0.2
stopped working for many people (including my app), but using the current version of androidx.appcompat:appcompat:1.2.0-alpha02
did fix the crash. (I was seeing it on a Huawei P8 Lite running Android 5.0 during Google's automated "Pre-launch report" testing).
Jun-2020 update: There are newer releases available than the one mentioned in the Feb-2020 update, you can see the currently available versions here:
- https://developer.android.com/jetpack/androidx/releases/appcompat
Warning: this workaround might also break some things; see the comments for details
If you'd like to inflate the WebView from an XML layout, you can wrap it in a nice little subclass (based on ikostet's answer):
public class LollipopFixedWebView extends WebView {
public LollipopFixedWebView(Context context) {
super(getFixedContext(context));
}
public LollipopFixedWebView(Context context, AttributeSet attrs) {
super(getFixedContext(context), attrs);
}
public LollipopFixedWebView(Context context, AttributeSet attrs, int defStyleAttr) {
super(getFixedContext(context), attrs, defStyleAttr);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public LollipopFixedWebView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(getFixedContext(context), attrs, defStyleAttr, defStyleRes);
}
public LollipopFixedWebView(Context context, AttributeSet attrs, int defStyleAttr, boolean privateBrowsing) {
super(getFixedContext(context), attrs, defStyleAttr, privateBrowsing);
}
public static Context getFixedContext(Context context) {
return context.createConfigurationContext(new Configuration());
}
}
EDIT: now even nicer with Kotlin
class LollipopFixedWebView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0,
defStyleRes: Int = 0
) : WebView(context.createConfigurationContext(Configuration()), attrs, defStyleAttr, defStyleRes)
If you are using androidx.appcompat:appcompat:1.1.0
and don't want to downgrade to androidx.appcompat:appcompat:1.0.2
or upgrading to androidx.appcompat:appcompat:1.2.0-alpha03
, there's another solution which is described in this comment on the Google Issue Tracker.
I noticed that after calling applyOverrideConfiguration,
Context.getAssets()
andContext.getResources().getAssets()
are not returning the same AssetManager object. The AssetManager returned fromContext.getAssets()
can't access resources in other packages (including the system WebView package), causing WebView to crash. If I overrideContext.getAssets()
to returngetResources().getAssets()
, the problem is gone.
Based on that comment, you can override the getAssets()
in the WebView's Activity so that it returns getResources().getAssets()
instead to solve the issue.
Java
@Override
public AssetManager getAssets() {
return getResources().getAssets();
}
Kotlin
override fun getAssets(): AssetManager {
return resources.assets
}