android.view.InflateException Błąd podczas zawyżania klasy android.webkit.WebView


132

W Lollipop (API 22) za każdym razem, gdy w mojej aplikacji wyświetlam webview, aplikacja ulega awarii. Mam wiele awarii w mojej konsoli programisty Androida związanych z tym zdarzeniem.

Nie trzeba mówić, że działa na Androidzie 4, 6 i 7.

Czytając ślad stosu (zamieszczony na końcu tego postu), coś mnie niepokoi

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

Szukałem w wygenerowanym R.java bez szczęścia, oczywiście bo ID nie istnieje, ale warto było spróbować.

Wyszukiwanie problemu w Google wydaje się być związane ze sposobem, w jaki Lollipop radzi sobie z wyświetlaniem w sieci Web. Uruchomiłem nowy AVD z Lollipop na podstawie urządzenia, które znalazłem w raporcie awarii w GDC i mogę odtworzyć problem.


Pełny ślad stosu:

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) 

To wygląda na WebViewproblem z systemem . Nie wiem, czy / kiedy emulatory otrzymają aktualizacje. Czy próbowałeś na sprzęcie?
CommonsWare

@commonsware no Nie mam teraz żadnego urządzenia z Lollipopem. Ale raport o awarii pokazuje wiele wpisów dotyczących tego.
Valerio,

18
To pytanie pochodzi z 2016 r., Ale problem ten pojawi się ponownie pod koniec 2019 r. Jeśli przybyłeś tutaj z wyszukiwarki internetowej, wybierz odpowiedzi, które dotyczą Ciebie.
user1032613

Nie mam fizycznego urządzenia na poziomie API 21. Próbowałem uruchomić aplikację na emulatorach Genymotion i Androida z API na poziomie 21, ale się zawiesza! Każdy tutaj daj mi znać, czy będzie działać na urządzeniu fizycznym! Teraz moja aplikacja jest zagrożona!
Sumit Shukla

Dla mnie Google Play zgłosił problem na Huawei P8 Lite z systemem Android 5.0, ale nie pojawił się na prawdziwym Samsung Note 4 z systemem Android 6.0.1 lub tablecie Samsung Note 8 z systemem Android 4.4.2.
FractalBob

Odpowiedzi:


172

Jeśli używasz androidx.appcompat:appcompat:1.1.0, spróbuj androidx.appcompat:appcompat:1.0.2zamiast tego. wygląda na to, że 1.1.0nie naprawia błędu WebVieww systemie Android 5.1.1.

Aktualizacja z lutego 2020 r .: Powrót do stanu, w którym 1.0.2przestał działać dla wielu osób (w tym mojej aplikacji), ale użycie bieżącej wersji androidx.appcompat:appcompat:1.2.0-alpha02rozwiązało awarię. (Widziałem to na Huawei P8 Lite z systemem Android 5.0 podczas automatycznego testowania Google „Raport przed uruchomieniem”).

Aktualizacja z czerwca 2020 r .: Dostępne są nowsze wersje niż te wymienione w aktualizacji z lutego 2020 r. Obecnie dostępne wersje można zobaczyć tutaj:


3
Czy istnieje poprawka dotycząca utrzymania wersji 1.1.0 i naprawienia tego? Jesteśmy zależni od pewnych rzeczy, których nie ma w wersji 1.0.2 i wygląda na to, że niektóre wersje alfa lub beta 1.1.0 nie mają tego błędu.
PampaZiya

3
Tak, naprawiono to, dziękuję! Używam beta01 i wszystko wydaje się w porządku. Będę go nadal używać, ponieważ i tak nie ma oczywistych korzyści z używania wersji 1.1.0.
PampaZiya

11
Jest problem związany z tą regresją
Brais Gabin

3
Tak jak dzisiaj downgrade nie działa, w moim przypadku działa to rozwiązanie z issuetracker.google.com/issues/141132133 : „Może najprostszym sposobem rozwiązania tego problemu jest wymuszenie na Gradle ustawienia wersji na 1.1.0- rc01. Dodaj to do swojego pliku gradle. configuration.all {resolutionStrategy {force 'androidx.appcompat: appcompat: 1.1.0-rc01'}} "
Talu

3
androidx.appcompat:appcompat:1.2.0-alpha03też działa
Artem

45

Ostrzeżenie: to obejście może również zepsuć pewne rzeczy; szczegóły w komentarzach

Jeśli chcesz nadmuchać WebView z układu XML, możesz zawinąć go w ładną małą podklasę (na podstawie odpowiedzi 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());
    }
}

EDYCJA: teraz jeszcze ładniej z Kotlinem

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

1
Znalazłem ten sam problem i użyłem tego rozwiązania, aby go naprawić, dziękuję
itsa04g9

Aktualizacja Android WebView na urządzeniu również rozwiązuje problem
wyświetlana nazwa

2
Nadal problem w 2019 roku i działa, ale nie mam pojęcia dlaczego / jak, byłoby dobrze, gdyby to zostało wyjaśnione. Otrzymuję również ostrzeżenie Nie jest nigdy używane na czwartym konstruktorze „publiczny LollipopFixedWebView (kontekst kontekstowy, atrybuty AttributeSet, int defStyleAttr, int defStyleRes) {"
David,

4
Tylko słowo przestrogi dotyczące tego obejścia: utworzenie wystąpienia WebView z pustym kontekstem może prowadzić do niezamierzonych efektów ubocznych. Na przykład, ActionModes z WebView prawdopodobnie nie będą już działać (tj. Długie naciśnięcie, aby podświetlić tekst).
Dmitry Brant

5
Jak powiedział @DmitryBrant, zachowaj ostrożność podczas wdrażania tego, ponieważ powoduje to uszkodzenie kilku rzeczy, w tym rozwijanych pól i długiego naciśnięcia, aby podświetlić tekst !
user5507535

42

Jeśli używasz androidx.appcompat:appcompat:1.1.0i nie chcesz przejść na starszą wersję androidx.appcompat:appcompat:1.0.2lub uaktualnić do androidx.appcompat:appcompat:1.2.0-alpha03, istnieje inne rozwiązanie, które jest opisane w tym komentarzu do Google Issue Tracker.

Zauważyłem, że po wywołaniu applyOverrideConfiguration Context.getAssets()i Context.getResources().getAssets()nie zwracają tego samego obiektu AssetManager. AssetManager zwrócony z Context.getAssets()nie może uzyskać dostępu do zasobów w innych pakietach (w tym systemowym pakiecie WebView), powodując awarię WebView. Jeśli zastąpię Context.getAssets()powrót getResources().getAssets(), problem zniknie.

Na podstawie tego komentarza możesz zastąpić działanie getAssets()w WebView, aby getResources().getAssets()zamiast tego powróciło w celu rozwiązania problemu.

Jawa

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

Kotlin

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

3
Świetna odpowiedź +1
Shirane85

Cześć, gdyby to była prawda, w jaki sposób można by to naprawić za pomocą wydania appCompact, które nie jest powiązane z AssetManager i samą przeglądarką internetową?
Sinapse,

Patrząc na applyOverrideConfiguration listę zmian, wydaje się, że niektóre wersje przeglądarki internetowej mają problemy z wywołaniami w bibliotece AppCompat.
Prawira

34

radzę używać niestandardowego / nowego Configurationtylko wtedy, gdy „oryginalny” powoduje problemy, więc tylko na Lollipopie. Kod @SpaceBizon działa dobrze do Androida 8.x, na 9 i Q (obecnie beta) każde naciśnięcie AlertDialogselektora / listy rozwijanej nie pokaże selektora, zamiast tego pojawia się wyciek pamięci ... poniżej ustalonej getFixedContextmetody z "iffed" poprawnym kodem wersji

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

Jeśli używasz androidx.appcompat: appcompat: 1.1.0, zmień na androidx.appcompat: appcompat: 1.0.2 lub jeśli chcesz używać motywu DayNight, nadpisz ApplyOverrideConfiguration w swojej aktywności w następujący sposób. (Uwaga: wymaga to ponownego uruchomienia aplikacji podczas przełączania z ciemnego motywu na jasny motyw i odwrotnie).

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

To obejście działa, ale czy nie powinno być dla 21..22zamiast 21..25? Wydaje się, że problem nie występuje w API 23+.
Dmitry Brant

5
To jest wersja, która spowodowała awarię - android.googlesource.com/platform/frameworks/support/+/… . Tak więc, zgodnie z kodem, awaria wystąpi w API 21..25 ​​na urządzeniach, na których nie jest zainstalowany Google Play Store i Android Webview w wersji <50.
AR Mythili Saran

Przejście na androidx.appcompat: appcompat: 1.0.2 załatw sprawę, dzięki
Talu

3
Moje obejście w Javie, które wydaje się działać dla mnie, jest takie (przepraszam za okropne formatowanie, ale to nie jest nowa odpowiedź, tylko 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 dlaczego mówisz, że dzieje się tak tylko w „urządzeniach, na których nie jest zainstalowany Google Play Store i wersja Android Webview jest <50”?
andrei

20

Jeśli nie korzystasz z przełączania motywu DayNight (lub innych zdarzeń UiMode), możesz dodać android: configChanges = "uiMode" do manifestu aktywności Webview, aby uniemożliwić AppCompatDelegate zaktualizowanie konfiguracji zasobów, a tym samym zepsucie inflacji widoku internetowego.


To zadziałało dla mnie. Potrzebuję ConstraintLayout 1.1.3, który wymaga appcompat 1.1.0, więc przywrócenie nie wchodziło w grę.
Matt Robertson

Obniżenie do wersji 1.0.2 nie miało dla mnie żadnego znaczenia, ale ta metoda zadziałała.
chrisbtoo

super rozwiązanie!
bojan

17

Spróbuj użyć do tworzenia widoku internetowego:

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

i mój plik xml?
Acauã Pitta

To rozwiązało mój problem bez obniżania wersji biblioteki
Błędy wydarzyły się

10

I jeszcze raz spróbuj rozwiązać problem. Powinien zastąpić tę metodę w swoim działaniu:

    @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

Udało mi się odtworzyć awarię na API 21 w emulatorze.

Próbowałem więc dodać to do implementacji, jak opisano w dokumentach :

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

Dodawanie appcompat-resourcesnie nie rozwiązać problem.

Być może przyszła wersja będzie, ale chciałem wspomnieć, że wydaje się, że istnieje biblioteka uzupełniających zasobów, która ma rozwiązać ten problem. Dlatego próbując rozwiązać ten problem za pomocą nowej wersji programu appcompat, dodaj appcompat-resourcesbibliotekę w tej samej wersji.

Przywrócenie wersji androidx.appcompat:appcompat:1.0.2rozwiązało problem jako obejście.


Nie mogłem wrócić "androidx.appcompat:appcompat-resources:$appcompat_version"do wersji 1.0.2. „BŁĄD: nie udało się rozwiązać problemu: androidx.appcompat: appcompat-resources: 1.0.2”
Murillo Comino

appcompat-resources nie jest dostępne w wersji 1.0.2. Zobacz moją zaktualizowaną odpowiedź.
Manuel

Dziękuję bardzo, zadziałało. Mam nadzieję, że w przyszłych wersjach to rozwiążemy.
Murillo Comino

5

Poniższy kod rozwiąże problem. Dodaj go do Activity:

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

3

Na marginesie, przez chwilę walczyłem, mimo że obniżyłem wersję 1.0.2, tylko dlatego, że wydawało mi się, że mam przechodnią zależność od appcompat: 1.1.0 przez androidx.constraintlayout: constraintlayout: 2.0.0-beta3. Kiedyś obniżyłem to do constraintlayout: 1.1.3 wszystko działało dobrze

(Według https://issuetracker.google.com/issues/141351441 problem zostanie wkrótce rozwiązany dzięki appcompat: 1.2.0-alpha02)


3

Użyłem najnowszej wersji z tego źródła . Sprawdź i użyj własnego na podstawie tego, co uważasz za najlepsze.

Jeśli chcesz pominąć, poniższa implementacja rozwiązuje problem:

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

2

戴 文锦 też był dla mnie odpowiedni. Ale obniżenie wersji tylko androidx.appcompat: appcompat: 1.1.0 do 1.0.2 nie powiodło się.

Zmniejszyłem wszystkie moje poprzednio zaktualizowane wersje Androidax z

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'

wrócić do

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'

Przypomnienie, że kod Googles zdecydowanie nie jest wolny od błędów i dobrze przetestowany oraz że ktoś nigdy nie powinien lekceważyć aktualizacji.


Czy obniżyłeś wersję androidx.appcompat: appcompat do wersji 1.1.0-rc01? Nie do 1.0.2?
Zhebzhik Babich

Wypróbowałem to w wersji 1.0.2, ale bez powodzenia. Musi być jedną z pozostałych zależności w połączeniu z appcompat.
S. Gissel

Po prostu obniżyło androidx.appcompat:appcompatmi się. Do przyszłych czytelników: pamiętaj o „gradacji synchronizacji” i potwierdź, że to dla Ciebie niewystarczające, zanim obniżysz wersję.
user1032613

Po obniżeniu nie będzie zbyteczne sprawdzanie wersji zależności w projekcie 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 publikując fragment kodu, który pomógł nam rozwiązać problem. Ale pamiętaj, aby zrobić to pierwsze stackoverflow.com/a/57715955/2344192
nazwa wyświetlana

2
Uważaj, to obejście dzieli pola rozwijane i zaznaczanie tekstu w widoku WebView.
user5507535

2

AppCompat 1.2.0-alpha02 został wydany dzisiaj, więc możesz używać

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

który naprawi problemy z WebView w Lollipop.


rozwiązuje problem, ale ponieważ jest to wersja alfa, może powodować inne błędy. jeśli próbowałeś, czy nie napotkałeś żadnego innego problemu w swojej aplikacji?
Soheil

@Soheil Nie, nie doświadczyłem żadnych usterek. Wersje alfa są oczywiście zawsze nieco ryzykowne. Na przykład wspomniano tutaj błąd dotyczący alpha02: issuetracker.google.com/issues/141351441#comment48
Dimitris Pattas

2

Udało mi się odtworzyć ten problem na Nexus 7 API 22. Problem został rozwiązany poprzez aktualizację wersji Android System WebView tabletu z wersji 39 (2237560-arm) do wersji 79.0.3945.136

Nie mam nad tym kontroli, aby użytkownik mógł to zrobić, ale jest to rozwiązanie, jeśli chcesz natychmiast pomóc komuś w korzystaniu z Twojej aplikacji.


1

Problem został rozwiązany przez przejście na wersję „androidx.appcompat: appcompat: 1.0.2”


1

W moim przypadku problem tkwił w metodzie

fun getUserId(): Int = userId

MainActivity. Nie wiem, dlaczego to wpływa WebView. getUserId()nie jest ani nadpisaną, ani publiczną metodą Activityklasy. Jeśli zmienię nazwę lub usunę tę metodę, WebViewzaczyna się otwierać. Próbuję też się zmienić

private var userId: Int = 0

do

var userId: Int = 0
    private set

prowadzi do tego samego wyjątku. I rozumieć, że gdy widział wyjątek: 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. W tym przypadku user = 123456 był w rzeczywistości moim autoryzowanym użytkownikiem, który był używany w niektórych żądaniach, a nie w WebView. Podejrzewam, że Android używa userIdjako lokalnego user_id dla swoich procesów.

Jak wiele osób zauważyło, możemy użyć klasy appcompat:1.1.0lub 1.0.2i ją rozszerzyć WebView. W emulatorze 21 bez usług Google Play WebViewbędzie się to zawieszać po długim dotknięciu etykiet tekstowych, ale na typowych urządzeniach wszystko jest w porządku.


0

Zamiast zmieniać wersję dowolnej zależności, zaimplementowałem programowo generowanie webView jako rozwiązanie.

Problem wygląda tak, jakby zaczynał się od odczytu układu z pliku xml. Więc jeśli programistyczny sposób jest dla Ciebie odpowiednim rozwiązaniem, sprawdź poniższą próbkę.

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

Następnie dodaj do widoku rodzica:

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

-4

Sprawdź wersję. Androidx appcompat i wersja materiału Google są zawsze takie same.

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"

wprowadź opis obrazu tutaj


1
Przykładowy kod należy wkleić bezpośrednio w odpowiedzi na wypadek, gdyby połączony obraz stał się niedostępny później.
Louis Charette
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.