android.view.InflateException Fehler beim Aufblasen der Klasse android.webkit.WebView


128

In Lollipop (API 22) zeige ich jedes Mal in meiner Anwendung eine Webansicht, wenn die Anwendung abstürzt. Ich habe mehrere Abstürze in meiner Android-Entwicklerkonsole im Zusammenhang mit diesem Ereignis.

Keine Notwendigkeit zu sagen, dass es auf Android 4, 6 und 7 funktioniert.

Beim Lesen des Stack-Trace (am Ende dieses Beitrags veröffentlicht) nervt mich etwas

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

Ich habe in der generierten R.java ohne Glück gesucht, offensichtlich, weil die ID nicht existiert, aber es war einen Versuch wert.

Das Googeln um das Problem scheint damit zu tun zu haben, wie Lollipop mit der Webansicht umgeht. Ich habe eine neue AVD mit Lollipop gestartet, die auf einem Gerät basiert, das ich auf dem Crash Reporter in GDC gefunden habe, und ich kann das Problem reproduzieren.


Full-Stack-Trace:

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) 

Dies scheint ein Systemproblem WebViewzu sein. Ich weiß nicht, ob / wann die Emulatoren Updates dazu bekommen. Haben Sie Hardware anprobiert?
CommonsWare

@commonsware nein ich habe momentan kein gerät mit lollipop. Der Crash-Reporter zeigt dafür jedoch mehrere Einträge an.
Valerio

18
Diese Frage stammt aus dem Jahr 2016, aber diese Ausgabe taucht Ende 2019 erneut auf. Wenn Sie über eine Websuche hierher gekommen sind, müssen Sie die für Sie zutreffenden Antworten auswählen.
user1032613

Ich habe kein physisches Gerät mit API-Level 21. Ich habe versucht, eine App auf Genymotion- und Android-Emulatoren mit API-Level 21 auszuführen, aber es stürzt ab! Jeder hier lässt mich wissen, ob es auf physischen Geräten funktioniert! Jetzt ist meine App gefährdet!
Sumit Shukla

Für mich hat Google Play das Problem auf einem Huawei P8 Lite mit Android 5.0 gemeldet, aber auf einem echten Samsung Note 4 mit Android 6.0.1 oder einem Samsung Note 8-Tablet mit Android 4.4.2 ist es nicht aufgetaucht.
FractalBob

Antworten:


166

Wenn Sie verwenden androidx.appcompat:appcompat:1.1.0, versuchen Sie es androidx.appcompat:appcompat:1.0.2stattdessen. Es scheint, dass 1.1.0dies den Fehler WebViewin Android nicht behebt 5.1.1.

Update vom Februar 2020: Die Wiederherstellung der 1.0.2Funktion für viele Benutzer (einschließlich meiner App) wurde eingestellt, aber die Verwendung der aktuellen Version von androidx.appcompat:appcompat:1.2.0-alpha02hat den Absturz behoben . (Ich habe es auf einem Huawei P8 Lite mit Android 5.0 während des automatisierten Tests "Pre-Launch Report" von Google gesehen.)

Update für Juni 2020: Es sind neuere Versionen verfügbar als die im Update für Februar 2020 genannten. Die derzeit verfügbaren Versionen finden Sie hier:


3
Gibt es eine Fehlerbehebung, um 1.1.0 beizubehalten und zu beheben? Wir sind auf einige Dinge angewiesen, die in 1.0.2 nicht vorhanden sind, und es scheint, dass einige Alpha- oder Beta-Versionen von 1.1.0 diesen Fehler nicht haben.
PampaZiya

3
Ja ein sauberes Problem, danke! Ich benutze Beta01 und alles scheint in Ordnung zu sein. Ich werde es weiterhin verwenden, da es ohnehin keinen offensichtlichen Vorteil gibt, 1.1.0 zu verwenden.
PampaZiya

11
Es gibt ein Problem im Zusammenhang mit dieser Regression: issuetracker.google.com/issues/141132133
Brais Gabin

3
Wie heute funktioniert das Downgrade nicht. In meinem Fall funktioniert diese Lösung von issuetracker.google.com/issues/141132133 wie folgt : "Der einfachste Weg, dieses Problem zu lösen, besteht darin, Gradle zu zwingen, die Version auf 1.1.0- zu setzen. rc01. Fügen Sie dies zu Ihrer Gradle-Datei hinzu. configuration.all {ResolutionStrategy {force 'androidx.appcompat: appcompat: 1.1.0-rc01'}} "
Talu

3
androidx.appcompat:appcompat:1.2.0-alpha03funktioniert auch
Artyom

45

Warnung: Diese Problemumgehung kann auch einige Probleme verursachen. Einzelheiten finden Sie in den Kommentaren

Wenn Sie das WebView aus einem XML-Layout aufblasen möchten, können Sie es in eine nette kleine Unterklasse einschließen (basierend auf der Antwort von 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: jetzt noch schöner mit Kotlin

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

1
Ich fand das gleiche Problem und benutzte diese Lösung, um es zu beheben, danke
itsa04g9

Das Aktualisieren des Android WebView auf dem Gerät behebt auch das Problem
Anzeigename

2
Noch ein Problem im Jahr 2019 und es funktioniert, aber ich habe keine Ahnung warum / wie, es wäre gut, wenn dies erklärt wird. Außerdem erhalte ich die Warnung Wird auf dem 4. Konstruktor "public LollipopFixedWebView (Kontextkontext, AttributeSet-Attribute, int defStyleAttr, int defStyleRes) {"
David

4
Nur ein Wort zur Vorsicht bei dieser Problemumgehung: Das Instanziieren einer WebView mit einem leeren Kontext kann zu unbeabsichtigten Nebenwirkungen führen. Beispielsweise funktionieren ActionModes aus der WebView wahrscheinlich nicht mehr (dh langes Drücken, um Text hervorzuheben).
Dmitry Brant

5
Wie @DmitryBrant sagte, seien Sie bei der Implementierung sehr vorsichtig, da dies einige Dinge zerstört, einschließlich Dropdown-Felder und langes Drücken, um Text hervorzuheben !
user5507535

41

Wenn Sie ein androidx.appcompat:appcompat:1.1.0Downgrade durchführen androidx.appcompat:appcompat:1.0.2oder kein Upgrade durchführen möchten androidx.appcompat:appcompat:1.2.0-alpha03, gibt es eine andere Lösung, die in diesem Kommentar im Google Issue Tracker beschrieben wird.

Ich bemerkte , dass nach applyOverrideConfiguration Aufruf, Context.getAssets()und Context.getResources().getAssets()nicht das gleiche Objekt Assetmanager zurück. Der von zurückgegebene AssetManager Context.getAssets()kann nicht auf Ressourcen in anderen Paketen (einschließlich des System-WebView-Pakets) zugreifen, wodurch WebView abstürzt. Wenn ich überschreibe, Context.getAssets()um zurückzukehren getResources().getAssets(), ist das Problem weg.

Basierend auf diesem Kommentar können Sie getAssets()die Aktivität in WebView überschreiben, sodass sie getResources().getAssets()stattdessen zurückgegeben wird, um das Problem zu beheben .

Java

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

Kotlin

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

3
Tolle Antwort +1
Shirane85

Hallo, wenn dies wahr wäre, wie würde dies mit einer Version von appCompact behoben werden, die nichts mit dem AssetManager und der Webansicht selbst zu tun hat?
Sinapse

Wenn Sie sich diese Änderungsliste ansehen, scheinen einige Webview-Versionen Probleme mit den applyOverrideConfigurationAufrufen in der AppCompat-Bibliothek zu haben.
Prawira

34

Mein Rat ist, benutzerdefinierte / neue Configurationnur zu verwenden, wenn "Original" Probleme verursacht, also nur auf Lollipop. @ SpaceBizon-Code funktioniert gut bis Android 8.x, bei 9 und Q (aktuelle Beta) wird bei jedem Auswahl- / Dropdown-Druck keine Auswahl angezeigt AlertDialog, stattdessen tritt ein Speicherverlust auf ... unterhalb der festgelegten getFixedContextMethode mit dem richtigen Versionscode "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

Wenn Sie androidx.appcompat: appcompat: 1.1.0 verwenden, wechseln Sie entweder zu androidx.appcompat: appcompat: 1.0.2, oder wenn Sie das DayNight-Design verwenden möchten, überschreiben Sie applyOverrideConfiguration in Ihrer Aktivität wie folgt. (Hinweis: Dies erfordert einen Neustart der App, wenn Sie von Dark Theme zu Light Theme und umgekehrt wechseln.)

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

Diese Problemumgehung funktioniert, aber sollte es nicht 21..22stattdessen sein 21..25? Das Problem scheint in API 23+ nicht aufzutreten.
Dmitry Brant

5
Dies ist die Revision, die diesen Absturz verursacht hat - android.googlesource.com/platform/frameworks/support/+/… . Entsprechend dem Code tritt der Absturz in API 21..25 ​​auf den Geräten auf, auf denen Google Play Store nicht installiert ist und die Android Webview-Version <50 ist.
AR Mythili Saran

Downgrade auf androidx.appcompat: appcompat: 1.0.2 mach den Trick, danke
Talu

3
Meine Problemumgehung in Java, die für mich zu funktionieren scheint, ist wie folgt (Entschuldigung für die schreckliche Formatierung, aber es ist keine neue Antwort, nur ein 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 Warum tritt dies nur bei "Geräten auf, auf denen Google Play Store nicht installiert ist und die Android Webview-Version <50 ist"?
Andrei

20

Wenn Sie sich nicht auf das Umschalten des DayNight-Themas (oder andere UiMode-Ereignisse) verlassen, können Sie dem Webview-Aktivitätsmanifest android: configChanges = "uiMode" hinzufügen, um zu verhindern, dass AppCompatDelegate die Ressourcenkonfiguration aktualisiert und dadurch die Webview-Inflation durcheinander bringt.


Das hat bei mir funktioniert. Ich benötige ConstraintLayout 1.1.3, für das Appcompat 1.1.0 erforderlich ist. Daher war das Zurücksetzen keine Option.
Matt Robertson

Ein Downgrade auf 1.0.2 machte für mich keinen Unterschied, aber diese Methode funktionierte.
Chrisbtoo

tolle Lösung!
Bojan

17

Versuchen Sie, eine Webansicht zu erstellen:

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

und meine XML-Datei?
Acauã Pitta

Dies löste mein Problem, ohne eine Bibliotheksversion herunterzustufen
Bugs Happen

10

Und noch ein Versuch, das Problem zu beheben. Sollte diese Methode in Ihrer Aktivität überschreiben:

    @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

Ich konnte den Absturz auf API 21 im Emulator reproduzieren.

Also habe ich versucht, dies zur Implementierung hinzuzufügen, wie in den Dokumenten beschrieben :

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

Hinzufügen appcompat-resourceshaben nicht das Problem zu beheben.

Vielleicht wird es eine zukünftige Version geben, aber ich wollte erwähnen, dass es eine ergänzende Ressourcenbibliothek zu geben scheint, die dieses Problem beheben soll. Wenn Sie versuchen, dies mit einer neuen Version von zu beheben appcompat, fügen Sie die appcompat-resourcesBibliothek mit derselben Version hinzu.

Durch Zurücksetzen auf androidx.appcompat:appcompat:1.0.2wurde das Problem als Problemumgehung behoben.


Ich konnte nicht auf "androidx.appcompat:appcompat-resources:$appcompat_version"Version 1.0.2 zurückgreifen . "FEHLER: Fehler beim Auflösen: androidx.appcompat: appcompat-resources: 1.0.2"
Murillo Comino

appcompat-resources ist für 1.0.2 nicht verfügbar. Siehe meine aktualisierte Antwort.
Manuel

Vielen Dank, es hat funktioniert. Ich hoffe, dass in zukünftigen Versionen dies gelöst wird.
Murillo Comino

5

Der folgende Code behebt das Problem. Bitte fügen Sie es in Ihre Activity:

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

3

Nur als Randnotiz, ich hatte eine Weile Probleme, obwohl ich auf 1.0.2 heruntergestuft hatte, nur weil ich eine transitive Abhängigkeit von appcompat: 1.1.0 über androidx.constraintlayout: Constraintlayout: 2.0.0-beta3 zu haben schien. Nachdem ich das auf Constraintlayout herabgestuft hatte: 1.1.3 hat alles gut funktioniert

(Laut https://issuetracker.google.com/issues/141351441 wird das Problem bald mit appcompat behoben: 1.2.0-alpha02)


3

Ich habe die neueste Version aus dieser Quelle verwendet . Bitte überprüfen und verwenden Sie Ihre eigenen, basierend auf dem, was Sie für am besten halten.

Wenn Sie überspringen möchten, löst die folgende Implementierung das Problem:

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

2

戴 文锦 war auch für mich richtig. Ein Downgrade von nur androidx.appcompat: appcompat: 1.1.0 auf 1.0.2 war jedoch nicht erfolgreich.

Ich habe alle meine zuvor aktualisierten AndroidX-Versionen von heruntergestuft

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'

zurück zu

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'

Eine Erinnerung daran, dass Googles-Code bei weitem nicht fehlerfrei und gut getestet ist und dass jemand die Versionen niemals flippig aktualisieren sollte.


Haben Sie androidx.appcompat: appcompat auf 1.1.0-rc01 herabgestuft? Nicht zu 1.0.2?
Zhebzhik Babich

Versuchte es mit 1.0.2 aber kein Erfolg. Muss eine der anderen Abhängigkeiten in Kombination mit appcompat sein.
S. Gissel

Einfach ein Downgrade androidx.appcompat:appcompathat bei mir funktioniert. Für zukünftige Leser: Stellen Sie sicher, dass Sie die Synchronisierung "gradle" durchführen und bestätigen, dass dies für Sie nicht ausreicht, bevor Sie weitere Inhalte herunterstufen.
user1032613

Nach dem Downgrade ist es nicht überflüssig, die Versionen der Abhängigkeiten im Projekt 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 Veröffentlichung des Code-Snippets, das uns bei der Lösung des Problems geholfen hat. Aber stellen Sie sicher, dass Sie dies zuerst tun stackoverflow.com/a/57715955/2344192
Anzeigename

2
Seien Sie vorsichtig, diese Problemumgehung unterbricht Dropdown-Felder und die Auswahl von Text in der WebView.
user5507535

2

AppCompat 1.2.0-alpha02 wurde heute veröffentlicht, sodass Sie es verwenden können

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

Dadurch werden WebView-Probleme auf Lollipop behoben.


Es behebt das Problem, aber da es sich um eine Alpha-Version handelt, kann es andere Fehler verursachen. Wenn Sie es versucht haben, haben Sie in Ihrer App kein anderes Problem festgestellt?
Soheil

@ Soheil Nein, ich habe keine Pannen erlebt. Alpha-Versionen sind natürlich immer etwas riskant. Zum Beispiel wird hier ein Fehler für alpha02 erwähnt: issuetracker.google.com/issues/141351441#comment48
Dimitris Pattas

2

Ich konnte dieses Problem auf einer Nexus 7-API 22 reproduzieren. Das Problem wurde behoben, indem die Tablet-Version von Android System WebView von Version 39 (2237560-arm) auf Version 79.0.3945.136 aktualisiert wurde

Dies liegt nicht in meiner Kontrolle, damit ein Benutzer dies tun kann, aber es ist eine Lösung, wenn Sie jemandem helfen müssen, Ihre App sofort zu verwenden.


1

Das Problem wurde für mich durch ein Downgrade auf die Implementierung 'androidx.appcompat: appcompat: 1.0.2' behoben.


1

In meinem Fall war ein Problem in der Methode

fun getUserId(): Int = userId

einer Hauptaktivität. Ich weiß nicht, warum es beeinflusst WebView. getUserId()ist weder überschrieben noch öffentliche Methode der ActivityKlasse. Wenn ich diese Methode umbenenne oder entferne, wird WebViewsie geöffnet. Ich versuche auch zu ändern

private var userId: Int = 0

zu

var userId: Int = 0
    private set

führt zu der gleichen Ausnahme. Ich habe das verstanden, als ich eine Ausnahme gesehen hatte : 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 diesem Fall war user = 123456 tatsächlich mein autorisierter Benutzer, der in einigen Anfragen verwendet wurde, nicht in WebView. Ich vermute, Android verwendet userIdals lokale Benutzer-ID für seine Prozesse.

Wie viele andere Leute bemerkten, konnten wir den Unterricht nutzen appcompat:1.1.0oder 1.0.2erweitern WebView. In Emulator 21 ohne Google Play Services WebViewstürzt dies bei langen Berührungen über Textbeschriftungen ab, aber auf typischen Geräten ist alles in Ordnung.


0

Anstatt die Version einer Abhängigkeit zu ändern, habe ich die programmgesteuerte Generierung von webView als Lösung implementiert.

Das Problem sieht tatsächlich so aus, als würde man mit dem Lesen des Layouts aus einer XML-Datei beginnen. Wenn also eine programmatische Lösung für Sie geeignet ist, überprüfen Sie bitte das folgende Beispiel.

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

Dann fügen Sie einfach Ihrer übergeordneten Ansicht hinzu:

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

-4

Version prüfen. Androidx Appcompat und Google Materialversion bleiben immer gleich.

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"

Geben Sie hier die Bildbeschreibung ein


1
Sie sollten den Beispielcode direkt in Ihre Antwort einfügen, falls das von Ihnen verknüpfte Bild später nicht mehr verfügbar ist.
Louis Charette
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.