android.view.InflateException Errore durante il gonfiaggio della classe android.webkit.WebView


131

In Lollipop (API 22) ogni volta che nella mia applicazione mostro una visualizzazione web l'applicazione va in crash. Ho più arresti anomali nella mia console per sviluppatori Android relativi a questo evento.

Non c'è bisogno di dire che funziona su Android 4, 6 e 7.

Leggendo la traccia dello stack (pubblicata alla fine di questo post), qualcosa mi infastidisce

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

Ho cercato nella R.java generata senza fortuna, ovviamente perché l'ID non esiste, ma valeva la pena provare.

Cercare su Google il problema sembra essere correlato al modo in cui lollipop gestisce la visualizzazione web. Ho avviato un nuovo AVD con lollipop basato su un dispositivo che ho trovato sul reporter di crash in GDC e posso riprodurre il problema.


Traccia dello stack completo:

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) 

Sembra un WebViewproblema di sistema . Non so se / quando gli emulatori ottengono aggiornamenti a questo. Hai provato su hardware?
CommonsWare

@commonsware no Non ho alcun dispositivo in questo momento con lollipop. Ma il reporter di crash mostra più voci per questo.
Valerio

18
Questa domanda risale al 2016, ma il problema si ripresenta alla fine del 2019. Se sei arrivato qui da una ricerca sul Web, assicurati di scegliere le risposte che si applicano a te.
user1032613

Non ho un dispositivo fisico di livello API 21. Ho provato a eseguire l'app su Genmony ed emulatori Android con livello API 21 ma si blocca! Qualcuno qui mi faccia sapere se funzionerà su Physical Device! Ora la mia app è a rischio!
Sumit Shukla

Per me, Google Play ha segnalato il problema su un Huawei P8 Lite con Android 5.0 ma non è emerso su un vero Samsung Note 4 con Android 6.0.1 o un tablet Samsung Note 8 con Android 4.4.2.
FractalBob

Risposte:


171

Se usi androidx.appcompat:appcompat:1.1.0, prova androidx.appcompat:appcompat:1.0.2invece. sembra che 1.1.0non risolva il bug con WebViewin Android5.1.1 .

Aggiornamento febbraio 2020: tornare a 1.0.2smettere di funzionare per molte persone (inclusa la mia app), ma l'utilizzo della versione corrente di androidx.appcompat:appcompat:1.2.0-alpha02ha risolto il crash. (Lo stavo vedendo su un Huawei P8 Lite con Android 5.0 durante il test automatizzato di Google "Rapporto pre-lancio").

Aggiornamento giugno 2020: sono disponibili versioni più recenti di quella menzionata nell'aggiornamento febbraio 2020, puoi vedere le versioni attualmente disponibili qui:


3
Esiste una correzione di bug per mantenere 1.1.0 e risolverlo? Ci affidiamo ad alcune cose non presenti nella 1.0.2 e sembra che alcune versioni alpha o beta della 1.1.0 non abbiano questo bug.
PampaZiya

3
Sì, un pulito riparato grazie! Sto usando beta01 e tutto sembra a posto. Continuerò a usarlo perché comunque non c'è alcun vantaggio evidente nell'usare 1.1.0.
PampaZiya

11
C'è un problema relativo a questa regressione: issuetracker.google.com/issues/141132133
Brais Gabin

3
Poiché oggi il downgrade non funziona, nel mio caso, questa soluzione da issuetracker.google.com/issues/141132133 funziona: "Forse il modo più semplice per risolvere questo problema è forzare Gradle a impostare la versione su 1.1.0- rc01. Aggiungi questo al tuo file gradle. configurations.all {resolutionStrategy {force 'androidx.appcompat: appcompat: 1.1.0-rc01'}} "
Talu

3
androidx.appcompat:appcompat:1.2.0-alpha03funziona anche
Artyom

45

Attenzione: questa soluzione alternativa potrebbe anche rompere alcune cose; vedere i commenti per i dettagli

Se desideri gonfiare il WebView da un layout XML, puoi racchiuderlo in una piccola sottoclasse (basata sulla risposta di 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: ora ancora più bello con Kotlin

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

1
Ho trovato lo stesso problema e ho usato questa soluzione per risolverlo, grazie
itsa04g9

Anche l'aggiornamento di Android WebView sul dispositivo risolve il problema
nome visualizzato

2
Ancora un problema nel 2019 e funziona, ma non ho idea del perché / come, sarebbe bello se venisse spiegato. Inoltre ricevo l'avviso Non viene mai utilizzato sul 4 ° costruttore "public LollipopFixedWebView (Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
David

4
Solo una parola di cautela su questa soluzione alternativa: creare un'istanza di un WebView con un contesto vuoto può portare a effetti collaterali indesiderati. Ad esempio, ActionModes da WebView probabilmente non funzionerà più (cioè premendo a lungo per evidenziare il testo).
Dmitry Brant,

5
Come ha detto @DmitryBrant, fai molta attenzione durante l'implementazione perché ciò interrompe alcune cose, inclusi i campi a discesa e la pressione prolungata per evidenziare il testo !
user5507535

42

Se stai utilizzando androidx.appcompat:appcompat:1.1.0e non desideri eseguire il downgrade androidx.appcompat:appcompat:1.0.2o l'aggiornamento a androidx.appcompat:appcompat:1.2.0-alpha03, esiste un'altra soluzione descritta in questo commento su Google Issue Tracker.

Ho notato che dopo aver chiamato applyOverrideConfiguration Context.getAssets()e Context.getResources().getAssets()non restituiscono lo stesso oggetto AssetManager. AssetManager restituito da Context.getAssets()non può accedere alle risorse in altri pacchetti (incluso il pacchetto WebView di sistema), causando l'arresto anomalo di WebView. Se eseguo Context.getAssets()l' override per tornare getResources().getAssets(), il problema è scomparso.

In base a quel commento, puoi sovrascrivere l'attività getAssets()della WebView in modo che ritorni getResources().getAssets()invece a risolvere il problema.

Giava

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

Kotlin

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

3
Ottima risposta +1
Shirane85

Salve, se fosse vero, come verrebbe risolto con una versione di appCompact che non è correlata ad AssetManager e alla visualizzazione web stessa?
Sinapse

Guardando questo elenco delle modifiche sembra che alcune versioni di Webview abbiano problemi con le applyOverrideConfigurationchiamate all'interno della libreria AppCompat.
Prawira

34

il mio consiglio è di usare custom / new Configurationsolo quando "originale" sta causando problemi, quindi solo su Lollipop. Il codice @SpaceBizon funziona bene fino ad Android 8.x, su 9 e Q (attualmente beta) ogni pressione di selezione / elenco a discesa non mostrerà il AlertDialogselettore, invece si verifica quella perdita di memoria ... sotto il getFixedContextmetodo fisso con il codice di versione corretto "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

Se stai utilizzando androidx.appcompat: appcompat: 1.1.0, cambia in androidx.appcompat: appcompat: 1.0.2 o se desideri utilizzare il tema DayNight, ignora applyOverrideConfiguration nella tua attività come segue. (Nota: questo richiede il riavvio dell'app durante il passaggio da Tema scuro a Tema chiaro e 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)
}

Questa soluzione alternativa funziona, ma non dovrebbe essere per 21..22, invece di 21..25? Il problema non sembra verificarsi nell'API 23+.
Dmitry Brant,

5
Questa è la revisione che ha causato questo arresto anomalo: android.googlesource.com/platform/frameworks/support/+/… . Quindi, secondo il codice, il crash si verificherà nell'API 21..25 ​​nei dispositivi in ​​cui Google Play Store non è installato e Android Webview Version è <50.
AR Mythili Saran

Downgrade ad androidx.appcompat: appcompat: 1.0.2 fai il trucco, grazie
Talu

3
La mia soluzione alternativa in java che sembra funzionare per me è così (scusate per l'orribile formattazione ma non è una nuova risposta solo una porta):@Override public void applyOverrideConfiguration(Configuration overrideConfiguration) { if (Build.VERSION.SDK_INT >= 21 && Build.VERSION.SDK_INT <= 25) { return; } super.applyOverrideConfiguration(overrideConfiguration); }
Mike Hardy

@ARMythiliSaran perché dici che questo si verifica solo nei "dispositivi in ​​cui Google Play Store non è installato e la versione di Android Webview è <50"?
andrei

20

Se non ti affidi alla commutazione del tema DayNight (o ad altri eventi UiMode), puoi aggiungere android: configChanges = "uiMode" al manifesto dell'attività webview per impedire ad AppCompatDelegate di aggiornare la configurazione delle risorse e quindi rovinare l'inflazione webview.


Questo ha funzionato per me. Ho bisogno di ConstraintLayout 1.1.3, che richiede appcompat 1.1.0, quindi il ripristino non era un'opzione.
Matt Robertson,

Il downgrade alla 1.0.2 non ha fatto differenza per me, ma questo metodo ha funzionato.
chrisbtoo

soluzione fantastica!
bojan

17

Prova a utilizzare per la creazione di visualizzazione web:

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

e il mio file xml?
Acauã Pitta

Questo ha risolto il mio problema, senza eseguire il downgrade di alcuna versione della libreria
bug si verificano il

10

E ancora un tentativo per risolvere il problema. Dovrebbe sostituire questo metodo nella tua attività:

    @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

Sono stato in grado di riprodurre il crash su API 21 nell'emulatore.

Quindi ho provato ad aggiungerlo all'implementazione, come descritto nei documenti :

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'aggiunta appcompat-resourcesnon ha risolto il problema.

Forse una versione futura lo farà, ma volevo menzionare che sembra esserci una libreria di risorse complementari che dovrebbe affrontare questo problema. Quindi, quando provi a risolvere questo problema con una nuova versione di appcompat, aggiungi il fileappcompat-resources libreria con la stessa versione.

Il ripristino androidx.appcompat:appcompat:1.0.2ha risolto il problema come soluzione alternativa.


Non sono riuscito a tornare "androidx.appcompat:appcompat-resources:$appcompat_version"alla versione 1.0.2. "ERRORE: Impossibile risolvere: androidx.appcompat: appcompat-resources: 1.0.2"
Murillo Comino

appcompat-resources non è disponibile per 1.0.2. Vedi la mia risposta aggiornata.
Manuel

Grazie mille, ha funzionato. Spero che nelle versioni future risolva questo problema.
Murillo Comino

5

Il codice seguente risolverà il problema. Per favore aggiungilo nel tuo Activity:

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

3

Come nota a margine, ho lottato per un po 'anche se sono passato a 1.0.2, solo perché mi sembrava di avere una dipendenza transitiva da appcompat: 1.1.0 tramite androidx.constraintlayout: constraintlayout: 2.0.0-beta3. Una volta che l'ho declassato a vincolo di layout: 1.1.3 tutto ha funzionato bene

(Secondo https://issuetracker.google.com/issues/141351441 il problema verrà risolto presto con appcompat: 1.2.0-alpha02)


3

Ho usato l'ultima versione da questa fonte . Si prega di controllare e utilizzare il proprio in base a ciò che si ritiene sia meglio.

Nel caso in cui desideri saltare, l'implementazione di seguito risolve il problema:

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

2

戴 文锦 era giusto anche per me. Ma il downgrade solo di androidx.appcompat: appcompat: 1.1.0 a 1.0.2 non è riuscito.

Ho eseguito il downgrade di tutte le mie versioni di androidx precedentemente aggiornate da

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'

torna a

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 promemoria che il codice di Google non è di gran lunga privo di bug e ben testato e che qualcuno non dovrebbe mai aggiornare le versioni in modo impertinente.


Hai effettuato il downgrade di androidx.appcompat: appcompat a 1.1.0-rc01? Non alla 1.0.2?
Zhebzhik Babich

Provato con 1.0.2 ma senza successo. Deve essere una delle altre dipendenze in combinazione con appcompat.
S. Gissel,

Il semplice downgrade ha androidx.appcompat:appcompatfunzionato per me. Per i futuri lettori: assicurati di "gradle sync" e conferma che non è sufficiente per te, prima di eseguire il downgrade di altri elementi.
user1032613

Dopo il downgrade non sarà superfluo verificare le versioni di dipendenze nel progetto 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 pubblicando lo snippet di codice che ci ha aiutato a risolvere il problema. Ma assicurati di fare questo primo stackoverflow.com/a/57715955/2344192
nome visualizzato

2
Fai attenzione, questa soluzione alternativa interrompe i campi a discesa e seleziona il testo nella visualizzazione Web.
user5507535

2

AppCompat 1.2.0-alpha02 è stato rilasciato oggi, quindi puoi usare

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

che risolverà i problemi di WebView su Lollipop.


risolve il problema ma poiché è la versione alpha può causare altri bug. se l'hai provato, non hai riscontrato altri problemi nella tua app?
Soheil

@Soheil No, non ho riscontrato alcun problema tecnico. Le versioni Alpha sono sempre un po 'rischiose, ovviamente. Ad esempio, qui viene menzionato un bug per alpha02: issuetracker.google.com/issues/141351441#comment48
Dimitris

2

Sono stato in grado di riprodurre questo problema su un Nexus 7 API 22. Il problema viene risolto aggiornando la versione del tablet di Android System WebView dalla versione 39 (2237560-arm) alla versione 79.0.3945.136

Questo non è sotto il mio controllo per un utente, ma è una soluzione se devi aiutare qualcuno a utilizzare immediatamente la tua app.


1

Il problema è stato risolto per me effettuando il downgrade all'implementazione "androidx.appcompat: appcompat: 1.0.2"


1

Nel mio caso c'era un problema nel metodo

fun getUserId(): Int = userId

di una MainActivity. Non so perché influisce WebView. getUserId()non è né sovrascritto né metodo pubblico della Activityclasse. Se rinomino o rimuovo questo metodo, WebViewinizia ad aprirsi. Anche cercando di cambiare

private var userId: Int = 0

per

var userId: Int = 0
    private set

porta alla stessa eccezione. Ho capito che quando aveva visto un'eccezione: 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. In quel caso user = 123456 era in effetti il ​​mio utente autorizzato, utilizzato in alcune richieste, non in WebView. Sospetto che Android utilizziuserId come user_id locale per i suoi processi.

Come molte altre persone hanno notato, potremmo usare appcompat:1.1.0o 1.0.2ed estendere la WebViewclasse. Nell'emulatore 21 senza Google Play Services questo si WebViewbloccherà al tocco prolungato sulle etichette di testo, ma sui dispositivi tipici tutto va bene.


0

Invece di modificare la versione di qualsiasi dipendenza, ho implementato la generazione programmatica di webView come soluzione.

Il problema sembra effettivamente iniziare con la lettura del layout dal file xml. Quindi, se il modo programmatico è una soluzione applicabile per te, controlla l'esempio di seguito.

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

Piuttosto che aggiungere semplicemente nella visualizzazione genitore:

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

-4

Controlla la versione. L'app compatibile con Androidx e la versione materiale di Google rimangono sempre le stesse.

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"

inserisci qui la descrizione dell'immagine


1
Dovresti incollare il codice di esempio direttamente nella tua risposta nel caso in cui l'immagine che hai collegato non sia più disponibile in seguito.
Louis Charette
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.