android.view.InflateException Error al inflar la clase android.webkit.WebView

131

En Lollipop (API 22) cada vez que en mi aplicación muestro una vista web, la aplicación se bloquea. Tengo varios bloqueos en mi consola de desarrollador de Android relacionados con este evento.

No hace falta decir que funciona en Android 4, 6 y 7.

Al leer el seguimiento de la pila (publicado al final de esta publicación), algo me molesta

Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x2040003

Busqué en el R.java generado sin suerte, obviamente porque el ID no existe, pero valió la pena intentarlo.

Buscar en Google el problema parece estar relacionado con la forma en que Lollipop maneja la vista web. Comencé un AVD nuevo con piruleta basado en un dispositivo que encontré en el reportero de fallas en GDC, y puedo reproducir el problema.


Seguimiento de pila completa:

android.view.InflateException: Binary XML file line #7: Error inflating class android.webkit.WebView
                  at android.view.LayoutInflater.createView(LayoutInflater.java:633)
                  at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:55)
                  at android.view.LayoutInflater.onCreateView(LayoutInflater.java:682)
                  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:741)
                  at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
                  at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
                  at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
                  at it.artecoop.ibreviary.WebViewFragment.onCreateView(WebViewFragment.java:67)
                  at android.support.v4.app.Fragment.performCreateView(Fragment.java:2087)
                  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1113)
                  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1295)
                  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801)
                  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1682)
                  at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:541)
                  at android.os.Handler.handleCallback(Handler.java:739)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:135)
                  at android.app.ActivityThread.main(ActivityThread.java:5254)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at java.lang.reflect.Method.invoke(Method.java:372)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
               Caused by: java.lang.reflect.InvocationTargetException
                  at java.lang.reflect.Constructor.newInstance(Native Method)
                  at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
                  at android.view.LayoutInflater.createView(LayoutInflater.java:607)
                  at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:55) 
                  at android.view.LayoutInflater.onCreateView(LayoutInflater.java:682) 
                  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:741) 
                  at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) 
                  at android.view.LayoutInflater.inflate(LayoutInflater.java:504) 
                  at android.view.LayoutInflater.inflate(LayoutInflater.java:414) 
                  at it.artecoop.ibreviary.WebViewFragment.onCreateView(WebViewFragment.java:67) 
                  at android.support.v4.app.Fragment.performCreateView(Fragment.java:2087) 
                  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1113) 
                  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1295) 
                  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801) 
                  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1682) 
                  at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:541) 
                  at android.os.Handler.handleCallback(Handler.java:739) 
                  at android.os.Handler.dispatchMessage(Handler.java:95) 
                  at android.os.Looper.loop(Looper.java:135) 
                  at android.app.ActivityThread.main(ActivityThread.java:5254) 
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at java.lang.reflect.Method.invoke(Method.java:372) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
               Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x2040003
                  at android.content.res.Resources.getText(Resources.java:299)
                  at android.content.res.Resources.getString(Resources.java:385)
                  at com.android.org.chromium.content.browser.ContentViewCore.setContainerView(ContentViewCore.java:684)
                  at com.android.org.chromium.content.browser.ContentViewCore.initialize(ContentViewCore.java:608)
                  at com.android.org.chromium.android_webview.AwContents.createAndInitializeContentViewCore(AwContents.java:631)
                  at com.android.org.chromium.android_webview.AwContents.setNewAwContents(AwContents.java:780)
                  at com.android.org.chromium.android_webview.AwContents.<init>(AwContents.java:619)
                  at com.android.org.chromium.android_webview.AwContents.<init>(AwContents.java:556)
                  at com.android.webview.chromium.WebViewChromium.initForReal(WebViewChromium.java:311)
                  at com.android.webview.chromium.WebViewChromium.access$100(WebViewChromium.java:96)
                  at com.android.webview.chromium.WebViewChromium$1.run(WebViewChromium.java:263)
                  at com.android.webview.chromium.WebViewChromium$WebViewChromiumRunQueue.drainQueue(WebViewChromium.java:123)
                  at com.android.webview.chromium.WebViewChromium$WebViewChromiumRunQueue$1.run(WebViewChromium.java:110)
                  at com.android.org.chromium.base.ThreadUtils.runOnUiThread(ThreadUtils.java:144)
                  at com.android.webview.chromium.WebViewChromium$WebViewChromiumRunQueue.addTask(WebViewChromium.java:107)
                  at com.android.webview.chromium.WebViewChromium.init(WebViewChromium.java:260)
                  at android.webkit.WebView.<init>(WebView.java:554)
                  at android.webkit.WebView.<init>(WebView.java:489)
                  at android.webkit.WebView.<init>(WebView.java:472)
                  at android.webkit.WebView.<init>(WebView.java:459)
                  at java.lang.reflect.Constructor.newInstance(Native Method) 
                  at java.lang.reflect.Constructor.newInstance(Constructor.java:288) 
                  at android.view.LayoutInflater.createView(LayoutInflater.java:607) 
                  at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:55) 
                  at android.view.LayoutInflater.onCreateView(LayoutInflater.java:682) 
                  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:741) 
                  at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) 
                  at android.view.LayoutInflater.inflate(LayoutInflater.java:504) 
                  at android.view.LayoutInflater.inflate(LayoutInflater.java:414) 
                  at it.artecoop.ibreviary.WebViewFragment.onCreateView(WebViewFragment.java:67) 
                  at android.support.v4.app.Fragment.performCreateView(Fragment.java:2087) 
                  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1113) 
                  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1295) 
                  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801) 
                  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1682) 
                  at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:541) 
                  at android.os.Handler.handleCallback(Handler.java:739) 
                  at android.os.Handler.dispatchMessage(Handler.java:95) 
                  at android.os.Looper.loop(Looper.java:135) 
                  at android.app.ActivityThread.main(ActivityThread.java:5254) 
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at java.lang.reflect.Method.invoke(Method.java:372) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
Valerio
fuente
Esto parece un WebViewproblema del sistema . No sé si / cuando los emuladores reciben actualizaciones de eso. ¿Has probado hardware?
CommonsWare
@commonsware no No tengo ningún dispositivo en este momento con piruleta. Pero el reportero de accidentes muestra múltiples entradas para esto.
Valerio
18
Esta pregunta era de 2016, pero este problema vuelve a surgir a fines de 2019. Si llegó aquí desde una búsqueda web, asegúrese de elegir las respuestas que se apliquen a usted.
user1032613
No tengo un dispositivo físico de API nivel 21. Intenté ejecutar la aplicación en Genymotion y emuladores de Android con API nivel 21, ¡pero falla! ¡Cualquiera aquí me dirá si funcionará en un dispositivo físico! ¡Ahora mi aplicación está en riesgo!
Sumit Shukla
Para mí, Google Play informó el problema en un Huawei P8 Lite con Android 5.0, pero no apareció en un Samsung Note 4 real con Android 6.0.1 o una tableta Samsung Note 8 con Android 4.4.2.
FractalBob

Respuestas:

171

Si usa androidx.appcompat:appcompat:1.1.0, intente en su androidx.appcompat:appcompat:1.0.2lugar. parece que 1.1.0no soluciona el error WebViewen Android 5.1.1.

Actualización de febrero de 2020: volviendo a 1.0.2dejar de funcionar para muchas personas (incluida mi aplicación), pero el uso de la versión actual de androidx.appcompat:appcompat:1.2.0-alpha02solucionó el bloqueo. (Lo estaba viendo en un Huawei P8 Lite con Android 5.0 durante la prueba automatizada del "Informe previo al lanzamiento" de Google).

Actualización de junio de 2020: hay versiones más nuevas disponibles que la mencionada en la actualización de febrero de 2020, puede ver las versiones disponibles actualmente aquí:

戴 文锦
fuente
3
¿Hay una corrección de errores para mantener 1.1.0 y solucionar esto? Dependemos de algunas cosas que no están presentes en 1.0.2 y parece que alguna versión alfa o beta de 1.1.0 no tiene este error.
PampaZiya
3
Sí, una limpieza lo arregló gracias! Estoy usando beta01 y todo parece estar bien. Seguiré usándolo porque no hay ningún beneficio obvio de usar 1.1.0 de todos modos.
PampaZiya
11
Hay un problema relacionado con esta regresión: issuetracker.google.com/issues/141132133
Brais Gabin
3
Como hoy, la degradación no funciona, en mi caso, esta solución de issuetracker.google.com/issues/141132133 funciona: "Quizás la forma más sencilla de resolver este problema es forzar a Gradle a configurar la versión en 1.1.0- rc01. Agregue esto a su archivo gradle. configurations.all {resolutionStrategy {force 'androidx.appcompat: appcompat: 1.1.0-rc01'}} "
Talu
3
androidx.appcompat:appcompat:1.2.0-alpha03también funciona
Artyom
45

Advertencia: esta solución alternativa también podría romper algunas cosas; ver los comentarios para más detalles

Si desea inflar WebView desde un diseño XML, puede envolverlo en una pequeña subclase agradable (según la respuesta de ikostet ):

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());
    }
}

EDITAR: ahora aún mejor con Kotlin

class LollipopFixedWebView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0,
    defStyleRes: Int = 0
) : WebView(context.createConfigurationContext(Configuration()), attrs, defStyleAttr, defStyleRes)
SpaceBison
fuente
1
Encontré el mismo problema y usé esta solución para solucionarlo, gracias
itsa04g9
La actualización de Android WebView en el dispositivo también soluciona el problema
nombre para mostrar
2
Sigue siendo un problema en 2019 y funciona, pero no tengo idea de por qué / cómo, sería bueno si esto se explicara. También recibo la advertencia No se usa nunca en el cuarto constructor "public LollipopFixedWebView (Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
David
4
Solo una advertencia sobre esta solución: crear una instancia de WebView con un contexto en blanco puede provocar efectos secundarios no deseados. Por ejemplo, ActionModes de WebView probablemente ya no funcionará (es decir, mantener presionado para resaltar el texto).
Dmitry Brant
5
Como dijo @DmitryBrant, tenga mucho cuidado al implementar esto porque esto rompe algunas cosas, incluidos los campos desplegables y la presión prolongada para resaltar el texto .
user5507535
42

Si está utilizando androidx.appcompat:appcompat:1.1.0y no desea cambiar androidx.appcompat:appcompat:1.0.2o actualizar a androidx.appcompat:appcompat:1.2.0-alpha03, hay otra solución que se describe en este comentario en Google Issue Tracker.

Me di cuenta de que después de llamar applyOverrideConfiguration, Context.getAssets()y Context.getResources().getAssets()no vuelven al mismo objeto AssetManager. El AssetManager que regresó Context.getAssets()no puede acceder a los recursos de otros paquetes (incluido el paquete WebView del sistema), lo que hace que WebView se bloquee. Si anulo Context.getAssets()para regresar getResources().getAssets(), el problema desaparecerá.

Según ese comentario, puede anular el getAssets()en la Actividad de WebView para que vuelva getResources().getAssets()a resolver el problema.

Java

@Override
public AssetManager getAssets() {
    return getResources().getAssets();
}

Kotlin

override fun getAssets(): AssetManager {
    return resources.assets
}
Prawira
fuente
3
Gran respuesta +1
Shirane85
Hola, si esto fuera cierto, ¿cómo se solucionaría esto con una versión de appCompact que no está relacionada con AssetManager y la vista web en sí?
Sinapse
Al mirar esta lista de cambios , parece que algunas versiones de webview tienen problemas con las applyOverrideConfigurationllamadas dentro de la biblioteca AppCompat.
Prawira
34

Mi consejo es usar custom / new Configurationsolo cuando el "original" esté causando problemas, por lo tanto, solo en Lollipop. El código de @SpaceBizon funciona bien hasta Android 8.x, en 9 y Q (actualmente beta) cada pulsación de selección / menú desplegable no mostrará el AlertDialogselector, en lugar de que se produzca una fuga de memoria ... getFixedContextmétodo fijo a continuación con el código de versión adecuado "iffed"

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);
    }

    private static Context getFixedContext(Context context) {
        if (Build.VERSION.SDK_INT >= 21 && Build.VERSION.SDK_INT < 23) // Android Lollipop 5.0 & 5.1
            return context.createConfigurationContext(new Configuration());
        return context;
    }
}
snachmsm
fuente
21

Si está utilizando androidx.appcompat: appcompat: 1.1.0, cambie a androidx.appcompat: appcompat: 1.0.2 o si desea usar el tema DayNight, anule applyOverrideConfiguration en su actividad de la siguiente manera. (Nota: Esto requiere reiniciar la aplicación mientras se cambia de Tema oscuro a Tema claro y viceversa).

override fun applyOverrideConfiguration(overrideConfiguration: Configuration?) {
        if (Build.VERSION.SDK_INT in 21..25 && (resources.configuration.uiMode ==  applicationContext.resources.configuration.uiMode)) {
                return
        }
        super.applyOverrideConfiguration(overrideConfiguration)
}
AR Mythili Saran
fuente
Esta solución funciona, pero ¿no debería ser para 21..22, en lugar de 21..25? El problema no parece ocurrir en API 23+.
Dmitry Brant
5
Esta es la revisión que causó este bloqueo: android.googlesource.com/platform/frameworks/support/+/… . Entonces, de acuerdo con el código, el bloqueo ocurrirá en API 21..25 ​​en los dispositivos en los que Google Play Store no está instalado y la versión de Android Webview es <50.
AR Mythili Saran
Cambiar a androidx.appcompat: appcompat: 1.0.2 funciona, gracias
Talu
3
Mi solución en Java que parece funcionar para mí es así (lo siento por el formato horrible, pero no es una nueva respuesta, solo un puerto):@Override public void applyOverrideConfiguration(Configuration overrideConfiguration) { if (Build.VERSION.SDK_INT >= 21 && Build.VERSION.SDK_INT <= 25) { return; } super.applyOverrideConfiguration(overrideConfiguration); }
Mike Hardy
@ARMythiliSaran, ¿por qué dice que esto solo ocurre en "los dispositivos en los que Google Play Store no está instalado y la versión de Android Webview es <50"?
andrei
20

Si no confía en el cambio de tema de DayNight (u otros eventos de UiMode), puede agregar android: configChanges = "uiMode" al manifiesto de actividad de webview para evitar que AppCompatDelegate actualice la configuración de recursos y, por lo tanto, estropee la inflación de webview.

S. Gissel
fuente
Esto funcionó para mí. Necesito ConstraintLayout 1.1.3, que requiere appcompat 1.1.0, por lo que revertir no era una opción.
Matt Robertson
La degradación a 1.0.2 no supuso ninguna diferencia para mí, pero este método funcionó.
chrisbtoo
increíble solución!
bojan
17

Intente usarlo para crear vistas web:

mWebView = new WebView(getActivity().createConfigurationContext(new Configuration()));
ikostet
fuente
y mi archivo xml?
Acauã Pitta
Esto resolvió mi problema, sin degradar ninguna versión de la biblioteca
errores ocurren
10

Y un intento más de solucionar el problema. Debería anular este método en su actividad:

    @Override
    public void applyOverrideConfiguration(final Configuration overrideConfiguration) {
        if (Build.VERSION.SDK_INT >= 21 && Build.VERSION.SDK_INT < 25) {
            overrideConfiguration.uiMode &= ~Configuration.UI_MODE_NIGHT_MASK;
        }
        super.applyOverrideConfiguration(overrideConfiguration);
    }
HotIceCream
fuente
5

Pude reproducir el bloqueo en API 21 en el emulador.

Así que intenté agregar esto a la implementación, como se describe en los documentos :

dependencies {
    def appcompat_version = "1.1.0"

    implementation "androidx.appcompat:appcompat:$appcompat_version"
    // For loading and tinting drawables on older versions of the platform
    implementation "androidx.appcompat:appcompat-resources:$appcompat_version"
}

Añadiendo appcompat-resourceshizo no solucionar el problema.

Tal vez lo haga una versión futura, pero quería mencionar que parece haber una biblioteca de recursos complementaria que se supone que abordará este problema. Entonces, cuando intente solucionar este problema con una nueva versión de appcompat, agregue la appcompat-resourcesbiblioteca con la misma versión.

Revertir a androidx.appcompat:appcompat:1.0.2solucionó el problema como solución.

Manuel
fuente
No pude volver "androidx.appcompat:appcompat-resources:$appcompat_version"a la versión 1.0.2. "ERROR: No se pudo resolver: androidx.appcompat: appcompat-resources: 1.0.2"
Murillo Comino
appcompat-resources no está disponible para 1.0.2. Vea mi respuesta actualizada.
Manuel
Muchas gracias, funcionó. Espero que en futuras versiones solucione esto.
Murillo Comino
5

El siguiente código solucionará el problema. Por favor agréguelo en su Activity:

@Override 
public AssetManager getAssets() {
    return getResources().getAssets(); 
}
avinasha
fuente
3

Solo como nota al margen, luché por un tiempo a pesar de que bajé a 1.0.2, solo porque parecía tener una dependencia transitiva a appcompat: 1.1.0 a través de androidx.constraintlayout: constraintlayout: 2.0.0-beta3. Una vez que lo rebajé a diseño de restricción: 1.1.3 todo funcionó bien

(Según https://issuetracker.google.com/issues/141351441, el problema se solucionará pronto con appcompat: 1.2.0-alpha02)

Jens Schmitt
fuente
3

Usé la última versión de esta fuente . Verifique y use el suyo según lo que crea que es mejor.

En caso de que desee omitir, la siguiente implementación resuelve el problema:

implementation 'androidx.appcompat:appcompat:1.2.0-beta01'
F.Mysir
fuente
2

戴 文锦 también era adecuado para mí. Pero la degradación de solo androidx.appcompat: appcompat: 1.1.0 a 1.0.2 no tuvo éxito.

Bajé todas mis versiones de androidx previamente actualizadas de

implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'com.google.android.material:material:1.1.0-alpha10'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.recyclerview:recyclerview:1.1.0-beta04'
implementation 'androidx.viewpager2:viewpager2:1.0.0-beta04'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.vectordrawable:vectordrawable:1.1.0'
implementation 'androidx.preference:preference:1.1.0'
implementation 'androidx.core:core:1.2.0-alpha04'

de regreso

implementation 'androidx.appcompat:appcompat:1.1.0-rc01'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'com.google.android.material:material:1.1.0-alpha09'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.recyclerview:recyclerview:1.1.0-beta03'
implementation 'androidx.viewpager2:viewpager2:1.0.0-beta03'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.vectordrawable:vectordrawable:1.1.0-rc01'
implementation 'androidx.preference:preference:1.1.0-rc01'
implementation 'androidx.core:core:1.2.0-alpha03'

Un recordatorio de que el código de Google no está libre de errores ni está bien probado y que nadie debería actualizar las versiones con ligereza.

S. Gissel
fuente
¿Has degradado androidx.appcompat: appcompat a 1.1.0-rc01? ¿No a 1.0.2?
Zhebzhik Babich
Probé con 1.0.2 pero sin éxito. Debe ser una de las otras dependencias en combinación con appcompat.
S. Gissel
Simplemente degradar androidx.appcompat:appcompatfuncionó para mí. Para futuros lectores: asegúrese de "sincronizar gradle" y confirme que no es suficiente para usted, antes de degradar más cosas.
user1032613
Después de la degradación, no será superfluo verificar las versiones de las dependencias en el proyecto stackoverflow.com/a/39020703/6055194
Zhebzhik Babich
2
/**
 * Customized WebView to avoid crashing on Android 5 and 6 (API level 21 to 23)
 * If the Android System WebView is old and is not updated, the WebView view inflation fails.
 * To reproduce the issue, try on OS 5 or 6 with Android System WebView 72.0.3626.76 (this version is just a reference point from being which we saw no crashes)
 */
class BrilliantWebView : WebView {

   companion object {
       private fun getBrilliantContext(context: Context?) =
            if (!OSUtils.hasNougat()) // OS < 24 or OS < 7.0
                context?.createConfigurationContext(Configuration())
            else
                context
    }

   constructor(context: Context?) : super(getBrilliantContext(context))
   constructor(context: Context?, attrs: AttributeSet?) : super(getBrilliantContext(context), attrs)
   constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(getBrilliantContext(context), attrs, defStyleAttr)
}
nombre para mostrar
fuente
@ sumit-shukla publicando el fragmento de código que nos ayudó a resolver el problema. Pero asegúrese de hacer esto primero stackoverflow.com/a/57715955/2344192
nombre para mostrar
2
Tenga cuidado, esta solución interrumpe los campos desplegables y la selección de texto en WebView.
user5507535
2

AppCompat 1.2.0-alpha02 se lanzó hoy, por lo que puede usar

implementation 'androidx.appcompat:appcompat:1.2.0-alpha02'

que solucionará los problemas de WebView en Lollipop.

Dimitris Pattas
fuente
Soluciona el problema, pero dado que es una versión alfa, puede causar otros errores. Si lo ha probado, ¿no ha enfrentado ningún otro problema en su aplicación?
Soheil
@Soheil No, no he experimentado ningún problema técnico. Las versiones alfa siempre son un poco arriesgadas, por supuesto. Por ejemplo, aquí se menciona un error para alpha02: issuetracker.google.com/issues/141351441#comment48
Dimitris Pattas
2

Pude reproducir este problema en una API 22 de Nexus 7. El problema se soluciona actualizando la versión de la tableta de Android System WebView de la versión 39 (2237560-arm) a la versión 79.0.3945.136

Esto no está bajo mi control para que un usuario haga esto, pero es una solución si necesita ayudar a alguien a usar su aplicación de inmediato.

TGruenwald
fuente
1

El problema se resolvió para mi degradando a la implementación 'androidx.appcompat: appcompat: 1.0.2'

Ceniza
fuente
1

En mi caso, un problema estaba en el método.

fun getUserId(): Int = userId

de una actividad principal. No sé por qué afecta WebView. getUserId()no es anulado ni método público de la Activityclase. Si cambio el nombre o elimino este método, WebViewcomienza a abrirse. También tratando de cambiar

private var userId: Int = 0

a

var userId: Int = 0
    private set

conduce a la misma excepción. Entendí que cuando había visto una excepción: Caused by: java.lang.SecurityException: Permission Denial: null asks to run as user 123456 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL or android.permission.INTERACT_ACROSS_USERS. En ese caso, user = 123456 era de hecho mi usuario autorizado, que se usó en algunas solicitudes, no en WebView. Sospecho que Android usauserId como user_id local para sus procesos.

Como muchas otras personas notaron, podríamos usar appcompat:1.1.0o 1.0.2y extender la WebViewclase. En el emulador 21 sin los servicios de Google Play, esto WebViewse bloqueará al tocar durante mucho tiempo las etiquetas de texto, pero en los dispositivos típicos todo está bien.

CoolMind
fuente
0

En lugar de cambiar la versión de cualquier dependencia, implementé la generación de webView mediante programación como solución.

En realidad, el problema parece comenzar con el diseño de lectura del archivo xml. Entonces, si la forma programática es una solución aplicable para usted, consulte la siguiente muestra.

private WebView generateWebView(){
    WebView wv = new WebView(YourContext);
    wv.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
    wv.setFitsSystemWindows(false); // your preferences
    wv.setVerticalScrollBarEnabled(false); // your preferences
    wv.setPadding(15,15,15,15); // your preferences
    return wv;
}

Que solo agregar a su vista de padres:

LinearLayout scrollContainer = findViewById(R.id.scrollContainer);
scrollContainer.addView(generateWebView());
Rıdvan Nuri Göçmen
fuente
-4

Consultar versión. El appcompat de Androidx y la versión de material de Google se mantienen siempre iguales.

implementation 'androidx.appcompat:appcompat:1.0.0'
implementation 'com.google.android.material:material:1.0.0'
implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation "androidx.cardview:cardview:1.0.0"

ingrese la descripción de la imagen aquí

Mahmudul hasan Muhib
fuente
1
Debe pegar el código de ejemplo directamente en su respuesta en caso de que la imagen que vinculó no esté disponible más adelante.
Louis Charette