android.view.InflateException Erreur de gonflage de la classe android.webkit.WebView


131

Dans Lollipop (API 22), chaque fois que dans mon application, je montre une vue Web, l'application se bloque. J'ai plusieurs plantages dans ma console de développement Android liés à cet événement.

Inutile de dire que cela fonctionne sur Android 4, 6 et 7.

Lire la trace de la pile (postée à la fin de cet article), quelque chose me dérange

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

J'ai cherché dans le R.java généré sans aucune chance, évidemment parce que l'ID n'existe pas, mais cela valait la peine d'essayer.

La recherche sur Google autour du problème semble être liée à la façon dont sucette gère la vue Web. J'ai commencé un nouvel AVD avec sucette basé sur un appareil que j'ai trouvé sur le journaliste de crash dans GDC, et je peux reproduire le problème.


Trace complète de la pile:

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) 

Cela ressemble à un WebViewproblème système . Je ne sais pas si / quand les émulateurs obtiennent des mises à jour à ce sujet. Avez-vous essayé du matériel?
CommonsWare

@commonsware non Je n'ai actuellement aucun appareil avec sucette. Mais le journaliste de crash affiche plusieurs entrées pour cela.
Valerio

18
Cette question datait de 2016, mais ce problème refait surface à la fin de 2019. Si vous êtes arrivé ici à la suite d'une recherche sur le Web, assurez-vous de choisir les réponses qui s'appliquent à vous.
user1032613

Je n'ai pas d'appareil physique de niveau API 21. J'ai essayé d'exécuter l'application sur les émulateurs Genymotion et Android avec le niveau API 21 mais ça plante! N'importe qui ici me fait savoir si cela fonctionnera sur un périphérique physique! Maintenant, mon application est en danger!
Sumit Shukla

Pour moi, Google Play a signalé le problème sur un Huawei P8 Lite sous Android 5.0, mais il ne s'est pas manifesté sur un vrai Samsung Note 4 sous Android 6.0.1 ou une tablette Samsung Note 8 sous Android 4.4.2.
FractalBob

Réponses:


171

Si vous utilisez androidx.appcompat:appcompat:1.1.0, essayez à la androidx.appcompat:appcompat:1.0.2place. il semble que 1.1.0cela ne corrige pas le bogue avec WebViewAndroid 5.1.1.

Mise à jour de février-2020: le retour à l' 1.0.2arrêt de travail pour de nombreuses personnes (y compris mon application), mais l'utilisation de la version actuelle de androidx.appcompat:appcompat:1.2.0-alpha02a corrigé le plantage. (Je le voyais sur un Huawei P8 Lite exécutant Android 5.0 lors des tests automatisés de "rapport de pré-lancement" de Google).

Mise à jour de juin-2020: il existe des versions plus récentes que celle mentionnée dans la mise à jour de février-2020, vous pouvez voir les versions actuellement disponibles ici:


3
Existe-t-il un correctif pour conserver la version 1.1.0 et résoudre ce problème? Nous dépendons de certaines choses qui ne sont pas présentes dans la version 1.0.2 et il semble que certaines versions alpha ou bêta de 1.1.0 ne présentent pas ce bogue.
PampaZiya

3
Oui un clean réparé c'est merci! J'utilise beta01 et tout semble bien. Je vais continuer à l'utiliser car il n'y a de toute façon aucun avantage évident à utiliser 1.1.0.
PampaZiya

11
Il y a un problème lié à cette régression: issuetracker.google.com/issues/141132133
Brais Gabin

3
Comme aujourd'hui, le downgrade ça ne marche pas, dans mon cas, cette solution de issuetracker.google.com/issues/141132133 fonctionne: "Peut-être que le moyen le plus simple de résoudre ce problème est de forcer Gradle à définir la version sur 1.1.0- rc01. Ajoutez ceci à votre fichier gradle. configurations.all {resolutionStrategy {force 'androidx.appcompat: appcompat: 1.1.0-rc01'}} "
Talu

3
androidx.appcompat:appcompat:1.2.0-alpha03fonctionne aussi
Artyom

45

Avertissement: cette solution de contournement peut également casser certaines choses; voir les commentaires pour plus de détails

Si vous souhaitez gonfler la WebView à partir d'une mise en page XML, vous pouvez l'envelopper dans une jolie petite sous-classe (basée sur la réponse d'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());
    }
}

EDIT: encore plus sympa avec Kotlin

class LollipopFixedWebView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0,
    defStyleRes: Int = 0
) : WebView(context.createConfigurationContext(Configuration()), attrs, defStyleAttr, defStyleRes)

1
J'ai trouvé le même problème et utilisé cette solution pour le résoudre, merci
itsa04g9

La mise à jour d'Android WebView sur l'appareil résout également le problème
nom d'affichage

2
Encore un problème en 2019 et ça marche, mais je ne sais pas pourquoi / comment, ce serait bien si cela était expliqué. Aussi j'obtiens l'avertissement n'est jamais utilisé sur le 4ème constructeur "public LollipopFixedWebView (Contexte contextuel, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
David

4
Juste un mot d'avertissement à propos de cette solution de contournement: instancier une WebView avec un contexte vide peut entraîner des effets secondaires involontaires. Par exemple, les ActionModes de WebView ne fonctionneront probablement plus (c'est-à-dire un appui long pour mettre le texte en surbrillance).
Dmitry Brant

5
Comme @DmitryBrant l'a dit, soyez très prudent lorsque vous implémentez cela, car cela casse certaines choses, y compris des champs déroulants et un appui long pour mettre le texte en surbrillance !
user5507535

42

Si vous utilisez androidx.appcompat:appcompat:1.1.0et que vous ne souhaitez pas rétrograder androidx.appcompat:appcompat:1.0.2ou effectuer une mise à niveau vers androidx.appcompat:appcompat:1.2.0-alpha03, il existe une autre solution qui est décrite dans ce commentaire sur Google Issue Tracker.

J'ai remarqué que après avoir appelé applyOverrideConfiguration, Context.getAssets()et Context.getResources().getAssets()ne renvoient pas le même objet AssetManager. AssetManager renvoyé deContext.getAssets() ne peut pas accéder aux ressources dans d'autres packages (y compris le package système WebView), ce qui provoque le blocage de WebView. Si je remplace Context.getAssets()pour revenir getResources().getAssets(), le problème a disparu.

Sur la base de ce commentaire, vous pouvez remplacer le getAssets() dans l'activité de WebView afin qu'il revienne à la getResources().getAssets()place pour résoudre le problème.

Java

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

Kotlin

override fun getAssets(): AssetManager {
    return resources.assets
}

3
Bonne

Salut, si c'était vrai, comment cela serait-il résolu avec une version d'appCompact qui n'est pas liée à AssetManager et à la vue Web elle-même?
Sinapse

En regardant cette liste de modifications, il semble que certaines versions de la vue Web rencontrent des problèmes avec les applyOverrideConfigurationappels dans la bibliothèque AppCompat.
Prawira

34

mon conseil est de n'utiliser custom / new Configurationque lorsque "original one" pose des problèmes, donc sur Lollipop uniquement. Le code @SpaceBizon fonctionne bien jusqu'à Android 8.x, sur 9 et Q (actuellement bêta), chaque pression de sélection / liste déroulante n'affichera pas le AlertDialogsélecteur, au lieu de cette fuite de mémoire se produit ... ci-dessous la getFixedContextméthode fixe avec le code de version approprié "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;
    }
}

21

Si vous utilisez androidx.appcompat: appcompat: 1.1.0, passez à androidx.appcompat: appcompat: 1.0.2 ou si vous souhaitez utiliser le thème DayNight, remplacez applyOverrideConfiguration dans votre activité comme suit. (Remarque: cela nécessite le redémarrage de l'application lors du passage du thème sombre au thème clair et vice versa).

override fun applyOverrideConfiguration(overrideConfiguration: Configuration?) {
        if (Build.VERSION.SDK_INT in 21..25 && (resources.configuration.uiMode ==  applicationContext.resources.configuration.uiMode)) {
                return
        }
        super.applyOverrideConfiguration(overrideConfiguration)
}

Cette solution de contournement fonctionne, mais ne devrait-elle pas être pour 21..22, au lieu de 21..25? Le problème ne semble pas se produire dans l'API 23+.
Dmitry Brant le

5
C'est la révision qui a causé ce crash - android.googlesource.com/platform/frameworks/support/+/… . Ainsi, selon le code, le plantage se produira dans l'API 21..25 ​​sur les appareils sur lesquels Google Play Store n'est pas installé et la version Android Webview est <50.
AR Mythili Saran le

Rétrogradation vers androidx.appcompat: appcompat: 1.0.2 faites l'affaire, merci
Talu

3
Ma solution de contournement en java qui semble fonctionner pour moi est comme ça (désolé pour l'horrible formatage mais ce n'est pas une nouvelle réponse juste un port):@Override public void applyOverrideConfiguration(Configuration overrideConfiguration) { if (Build.VERSION.SDK_INT >= 21 && Build.VERSION.SDK_INT <= 25) { return; } super.applyOverrideConfiguration(overrideConfiguration); }
Mike Hardy

@ARMythiliSaran pourquoi dites-vous que cela ne se produit que dans "les appareils sur lesquels Google Play Store n'est pas installé et la version Android Webview est <50"?
andrei

20

Si vous ne comptez pas sur le changement de thème DayNight (ou d'autres événements UiMode), vous pouvez ajouter android: configChanges = "uiMode" au manifeste d'activité de la vue Web pour empêcher AppCompatDelegate de mettre à jour la configuration des ressources et de gâcher ainsi l'inflation de la vue Web.


Cela a fonctionné pour moi. J'ai besoin de ConstraintLayout 1.1.3, qui nécessite appcompat 1.1.0, donc revenir en arrière n'était pas une option.
Matt Robertson le

Le passage à la version 1.0.2 ne me faisait aucune différence, mais cette méthode fonctionnait.
chrisbtoo le

solution géniale!
bojan

17

Essayez d'utiliser pour créer une vue Web:

mWebView = new WebView(getActivity().createConfigurationContext(new Configuration()));

et mon fichier xml?
Acauã Pitta

Cela a résolu mon problème, sans rétrograder aucune version de bibliothèque
Bugs Happen

10

Et un autre essaie de résoudre le problème. Devrait remplacer cette méthode dans votre activité:

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

5

J'ai pu reproduire le crash sur l'API 21 dans l'émulateur.

J'ai donc essayé d'ajouter ceci à l'implémentation, comme décrit dans la documentation :

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"
}

L'ajout appcompat-resourcesn'a pas résolu le problème.

Peut-être qu'une version future le sera, mais je tenais à mentionner qu'il semble y avoir une bibliothèque de ressources complémentaires qui est censée résoudre ce problème. Donc, lorsque vous essayez de résoudre ce problème avec une nouvelle version de appcompat, ajoutez leappcompat-resources bibliothèque avec la même version.

Revenir à androidx.appcompat:appcompat:1.0.2a résolu le problème comme solution de contournement.


Je n'ai pas pu revenir "androidx.appcompat:appcompat-resources:$appcompat_version"à la version 1.0.2. "ERREUR: échec de la résolution: androidx.appcompat: appcompat-resources: 1.0.2"
Murillo Comino

appcompat-resources n'est pas disponible pour la version 1.0.2. Voir ma réponse mise à jour.
Manuel

Merci beaucoup, cela a fonctionné. J'espère que dans les futures versions résoudront cela.
Murillo Comino

5

Le code ci-dessous résoudra le problème. Veuillez l'ajouter dans votre Activity:

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

3

Pour rappel, j'ai lutté pendant un certain temps même si je suis passé à la version 1.0.2, simplement parce que je semblait avoir une dépendance transitive à appcompat: 1.1.0 via androidx.constraintlayout: constraintlayout: 2.0.0-beta3. Une fois que j'ai rétrogradé cela à constraintlayout: 1.1.3 tout fonctionnait bien

(Selon https://issuetracker.google.com/issues/141351441, le problème sera bientôt résolu avec appcompat: 1.2.0-alpha02)


3

J'ai utilisé la dernière version de cette source . Veuillez vérifier et utiliser le vôtre en fonction de ce que vous pensez être le mieux.

Au cas où vous voudriez sauter, la mise en œuvre ci-dessous résout le problème:

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

2

戴 文锦 me convenait aussi. Mais la rétrogradation de androidx.appcompat: appcompat: 1.1.0 vers 1.0.2 n'a pas réussi.

J'ai rétrogradé toutes mes versions d'androidx précédemment mises à niveau 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'

retour à

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 rappel que le code de Googles n'est de loin pas exempt de bogues et bien testé et que quelqu'un ne devrait jamais mettre à niveau les versions à la légère.


Avez-vous rétrogradé androidx.appcompat: appcompat vers 1.1.0-rc01? Pas à 1.0.2?
Zhebzhik Babich

Je l'ai essayé avec la version 1.0.2 mais sans succès. Doit être l'une des autres dépendances en combinaison avec appcompat.
S. Gissel

Un simple déclassement a androidx.appcompat:appcompatfonctionné pour moi. Aux futurs lecteurs: assurez-vous de "graduer la synchronisation" et confirmez que ce n'est pas suffisant pour vous, avant de rétrograder plus de choses.
user1032613

Après la rétrogradation, il ne sera pas superflu de vérifier les versions des dépendances dans le projet 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)
}

@ sumit-shukla publiant l'extrait de code qui nous a aidés à résoudre le problème. Mais assurez-vous de faire ce premier stackoverflow.com/a/57715955/2344192
afficher le nom

2
Attention, cette solution de contournement décompose les champs déroulants et sélectionne du texte dans WebView.
user5507535

2

AppCompat 1.2.0-alpha02 est sorti aujourd'hui, vous pouvez donc utiliser

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

qui résoudra les problèmes de WebView sur Lollipop.


il corrige le problème mais comme il s'agit de la version alpha, cela peut causer d'autres bogues. si vous l'avez essayé, n'avez-vous rencontré aucun autre problème dans votre application?
Soheil le

@Soheil Non, je n'ai rencontré aucun problème. Les versions Alpha sont toujours un peu risquées, bien sûr. Par exemple, un bogue pour alpha02 est mentionné ici: issuetracker.google.com/issues/141351441#comment48
Dimitris Pattas

2

J'ai pu reproduire ce problème sur une API Nexus 7 22. Le problème est résolu en mettant à jour la version de la tablette d'Android System WebView de la version 39 (2237560-arm) à la version 79.0.3945.136

Ce n'est pas sous mon contrôle pour un utilisateur de faire cela, mais c'est une solution si vous avez besoin d'aider quelqu'un à utiliser votre application immédiatement.


1

Le problème a été résolu pour mon en rétrogradant à l'implémentation 'androidx.appcompat: appcompat: 1.0.2'


1

Dans mon cas, un problème était dans la méthode

fun getUserId(): Int = userId

d'une MainActivity. Je ne sais pas pourquoi cela affecte WebView. getUserId()n'est ni surchargée, ni méthode publique de la Activityclasse. Si je renomme ou supprime cette méthode, WebViewcommence à s'ouvrir. Essayer aussi de changer

private var userId: Int = 0

à

var userId: Int = 0
    private set

conduit à la même exception. Je compris que quand avait vu une exception: 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. Dans ce cas, user = 123456 était en fait mon utilisateur autorisé, qui a été utilisé dans certaines requêtes, pas dans WebView. Je soupçonne qu'Android utilise userIdcomme user_id local pour ses processus.

Comme beaucoup d'autres personnes l'ont remarqué, nous pourrions utiliser appcompat:1.1.0ou 1.0.2et étendre la WebViewclasse. Dans l'émulateur 21 sans services Google Play, cela WebViewplantera en cas de contact prolongé sur les étiquettes de texte, mais sur les appareils typiques, tout va bien.


0

Au lieu de changer de version d'une dépendance, j'ai implémenté la génération par programme de webView en tant que solution.

Le problème ressemble en fait à commencer par la lecture de la mise en page à partir d'un fichier xml. Donc, si la méthode programmatique est une solution applicable pour vous, veuillez vérifier l'exemple ci-dessous.

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 de simplement ajouter dans votre vue parentale:

LinearLayout scrollContainer = findViewById(R.id.scrollContainer);
scrollContainer.addView(generateWebView());

-4

Vérifiez la version. L'application Androidx et la version matérielle de Google restent toujours les mêmes.

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"

entrez la description de l'image ici


1
Vous devez coller l'exemple de code directement dans votre réponse au cas où l'image que vous avez liée deviendrait indisponible ultérieurement.
Louis Charette le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.