Помилка надування класу android.webkit.WebView android.view.InflateException


132

У Lollipop (API 22) кожного разу, коли у своїй програмі я показую веб-перегляд, програма перестає працювати. У моїй консолі розробника для android було кілька помилок, пов’язаних із цією подією.

Не потрібно говорити, що він працює на Android 4, 6 і 7.

Читаючи слід стека (розміщений в кінці цього допису), щось мене клопоче

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

Я шукав у створеній R.java без жодної удачі, очевидно, тому що ID не існує, але варто було спробувати.

Погуляння навколо проблеми, схоже, пов'язане з тим, як льодяник обробляє веб-перегляд. Я почав свіжий AVD з льодяником на основі пристрою, який я знайшов у звіті про аварійне завершення роботи в GDC, і я можу відтворити проблему.


Повний слід стека:

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) 

Це виглядає як системна WebViewпроблема. Я не знаю, чи / коли емулятори отримують оновлення до цього. Ви пробували апаратне забезпечення?
— CommonsWare

@commonsware ні У мене зараз немає жодного пристрою з льодяником. Але репортер показує кілька записів для цього.
— Валеріо

18
Це запитання було з 2016 року, але це питання знову з’являється в кінці 2019 року. Якщо ви приїхали сюди з веб-пошуку, не забудьте вибрати відповіді, які стосуються вас.
— user1032613

У мене немає фізичного пристрою API рівня 21. Я спробував запустити додаток на емуляторах Genymotion та Android з рівнем API 21, але він виходить з ладу! Хто-небудь тут, дайте мені знати, чи буде це працювати на фізичному пристрої! Тепер мій додаток ризикує!
— Суміт Шукла

Для мене Google Play повідомила про проблему на Huawei P8 Lite під керуванням Android 5.0, але вона не з'явилася на реальному Samsung Note 4 під керуванням Android 6.0.1 або планшеті Samsung Note 8 під керуванням Android 4.4.2.
— FractalBob

Відповіді:


172

Якщо ви використовуєте androidx.appcompat:appcompat:1.1.0, спробуйте androidx.appcompat:appcompat:1.0.2замість цього. здається, 1.1.0це не виправляє помилку WebViewв Android 5.1.1.

Оновлення лютого-2020: повернення до 1.0.2припинення роботи для багатьох людей (включаючи мій додаток), але за допомогою поточної версії androidx.appcompat:appcompat:1.2.0-alpha02було виправлено збій. (Я бачив це на Huawei P8 Lite під керуванням Android 5.0 під час автоматичного тестування Google "Звіт перед запуском").

Оновлення червня-2020: доступні новіші випуски, ніж ті, що згадуються в оновленнях лютого-2020, доступні на даний момент версії можна переглянути тут:


3
Чи є виправлення помилок для збереження 1.1.0 та виправлення цього? Ми покладаємось на деякі речі, відсутні в 1.0.2, і здається, що в деяких альфа-або бета-версіях 1.1.0 немає цієї помилки.
— PampaZiya

3
Так чистий виправлений це спасибі! Я використовую beta01 і все здається нормально. Я продовжуватиму його використовувати, оскільки явної користі від використання 1.1.0 все одно немає.
— ПампаЗія

11
Існує проблема, пов’язана з цим регресом: issueetracker.google.com/isissue/141132133
— Brais Gabin

3
Як і сьогодні, пониження версії не працює, в моєму випадку це рішення від issueetracker.google.com/isissue/141132133 працює: "Можливо, найпростіший спосіб вирішити цю проблему - змусити Gradle встановити версію на 1.1.0- rc01. Додайте це до файлу gradle. configurations.all {resolutionStrategy {force 'androidx.appcompat: appcompat: 1.1.0-rc01'}} "
— Талу

3
androidx.appcompat:appcompat:1.2.0-alpha03працює теж
— Артем

45

Попередження: цей спосіб вирішення також може порушити деякі речі; див. коментарі для деталей

Якщо ви хочете надути WebView з XML-макету, ви можете загорнути його в хороший підклас (на основі відповіді 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());
    }
}

РЕДАКТУЙТЕ: тепер ще приємніше Котліна

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

1
Я знайшов ту саму проблему і застосував це рішення, щоб її виправити, дякую
— itsa04g9

Оновлення Android WebView на пристрої також усуває проблему
— ім'я відображення

2
Все ще проблема в 2019 році, і вона працює, але я не маю уявлення, чому / як, було б добре, якби це було пояснено. Також я отримую застереження Ніколи не використовується на 4-му конструкторі "public LollipopFixedWebView (контекст контексту, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
— Девід,

4
Лише застереження щодо цього вирішення: інстанція WebView з порожнім контекстом може призвести до непередбачуваних побічних ефектів. Наприклад, ActionModes з WebView, ймовірно, більше не працюватиме (тобто тривалим натисканням, щоб виділити текст).
— Дмитро Бран

5
Як сказав @DmitryBrant, будьте дуже обережні при здійсненні цього, оскільки це порушує кілька речей, включаючи поля, що спадають, і довге натискання, щоб виділити текст !
— user5507535

42

Якщо ви використовуєте androidx.appcompat:appcompat:1.1.0і не хочете переходити на androidx.appcompat:appcompat:1.0.2оновлення до або оновлення androidx.appcompat:appcompat:1.2.0-alpha03, є ще одне рішення, яке описано в цьому коментарі в Google Tracker Issue Tracker.

Я помітив, що після виклику applyOverrideConfiguration Context.getAssets()і Context.getResources().getAssets()не повертає той самий об’єкт AssetManager. AssetManager повернувся з Context.getAssets()не може отримати доступ до ресурсів в інших пакетах (включаючи системний пакет WebView), що спричинить збій WebView. Якщо я перестану Context.getAssets()повертатися getResources().getAssets(), проблеми вже немає.

Виходячи з цього коментаря, ви можете змінити getAssets()активність у веб-перегляді, щоб він повернувся getResources().getAssets()замість вирішення проблеми.

Java

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

Котлін

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

3
Чудова відповідь +1
— Shirane85

Привіт, якби це було правдою, як би це було виправлено за допомогою випуску appCompact, який не має відношення до AssetManager та самого веб-перегляду?
— Синапс

Переглядаючи цей список змін, здається, що деякі версії веб-перегляду мають проблеми з applyOverrideConfigurationдзвінками всередині бібліотеки AppCompat.
— Правіра

34

моя порада - використовувати користувальницьку / нову Configurationлише тоді, коли "оригінальний" викликає проблеми, тому лише для Lollipop. Код @SpaceBizon працює добре до Android 8.x, 9 та Q (поточно бета-версія), кожен натискання вибору / випадаючого меню не показуватиме AlertDialogвибральник, замість цього відбувається витік пам'яті ... нижче фіксованого getFixedContextметоду із "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

Якщо ви використовуєте androidx.appcompat: appcompat: 1.1.0, або перейдіть на androidx.appcompat: appcompat: 1.0.2, або якщо ви хочете використовувати тему DayNight, перейдіть, застосуйтеOverrideConfiguration у вашій діяльності наступним чином. (Примітка. Для цього потрібно перезапустити додаток під час переходу з темної теми на світлу тему і навпаки).

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

Це вирішення працює, але чи не повинно бути 21..22цього замість 21..25? Здається, проблема не виникає в API 23+.
— Дмитро Брант

5
Це перегляд, який спричинив цей збій - android.googlesource.com/platform/frameworks/support/+/… . Так, згідно з кодом, збій відбудеться в API 21..25 ​​на пристроях, на яких Google Play Store не встановлений, а версія Android Webview - <50.
— AR Mythili Saran

Перехід на androidx.appcompat: appcompat: 1.0.2 зробіть трюк, дякую
— Талу

3
Моє вирішення проблеми в Java, яке, здається, працює для мене, таке (вибачте за жахливе форматування, але це не нова відповідь, лише порт):@Override public void applyOverrideConfiguration(Configuration overrideConfiguration) { if (Build.VERSION.SDK_INT >= 21 && Build.VERSION.SDK_INT <= 25) { return; } super.applyOverrideConfiguration(overrideConfiguration); }
— Майк Харді,

@ARMythiliSaran, чому ви говорите, що це відбувається лише в "пристроях, на яких Google Play Store не встановлено, а версія для веб-перегляду Android - <50"?
— Андрей

20

Якщо ви не покладаєтесь на перемикання тем DayNight (або інші події UiMode), ви можете додати android: configChanges = "uiMode" до маніфесту активності веб-перегляду, щоб запобігти AppCompatDelegate оновити конфігурацію ресурсів і тим самим зіпсувати інфляцію веб-перегляду.


Це працювало для мене. Мені потрібен ConstraintLayout 1.1.3, який вимагає appcompat 1.1.0, тому повернення не було варіантом.
— Метт Робертсон

Пониження рівня до 1.0.2 для мене не мало значення, але цей метод спрацював.
— chrisbtoo

приголомшливе рішення!
— bojan

17

Спробуйте використовувати для створення веб-перегляду:

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

і мій файл XML?
— Acauã Pitta

Це вирішило мою проблему, не зменшуючи жодної версії бібліотеки
— Bugs Happen

10

І ще одна спроба виправити проблему. Якщо цей спосіб повинен бути замінений у вашій діяльності:

    @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

Мені вдалося відтворити збій на API 21 в емуляторі.

Тому я спробував додати це до реалізації, як описано в документах :

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

Додавання appcompat-resourcesнічого НЕ вирішити проблему.

Можливо, майбутня версія буде, але я хотів зазначити, що, здається, існує додаткова бібліотека ресурсів, яка повинна вирішити це питання. Тому, намагаючись виправити це за допомогою нової версії appcompat, додайте appcompat-resourcesбібліотеку з тією ж версією.

Повернення до androidx.appcompat:appcompat:1.0.2проблеми вирішило проблему як вирішення.


Не вдалося повернутися "androidx.appcompat:appcompat-resources:$appcompat_version"до версії 1.0.2. "ПОМИЛКА. Не вдалося вирішити: androidx.appcompat: appcompat-ресурси: 1.0.2"
— Murillo Comino

appcompat-ресурси недоступні для 1.0.2. Дивіться мою оновлену відповідь.
— Мануель

Дякую вам, це спрацювало. Я сподіваюся, що в наступних версіях це вирішиться.
— Мурільо Коміно,

5

Нижче наведений код виправить проблему. Будь ласка, додайте його у свій Activity:

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

3

Як бічна зауваження, я деякий час боровся, хоч і знизив до 1.0.2, просто тому, що, здавалося, маю перехідну залежність до програми: 1.1.0 через androidx.constraintlayout: constraintlayout: 2.0.0-beta3. Після того, як я знизив це до обмеженняпланування: 1.1.3 все працювало нормально

(Відповідно до https://issuetracker.google.com/isissue/141351441, проблема буде вирішена незабаром за допомогою appcompat: 1.2.0-alpha02)


3

Я використовував останню версію з цього джерела . Будь ласка, перевірте та використовуйте свій власний на основі того, що ви вважаєте найкращим.

Якщо ви хочете пропустити, нижче реалізація вирішує проблему:

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

2

戴 文锦 теж підходив і для мене. Але понизити лише androidx.appcompat: appcompat: 1.1.0 до 1.0.2 не вдалося.

Я знизив усі мої раніше оновлені версії для Android

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'

повертатися до

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'

Нагадування про те, що код Googles далеко не вільний з помилок і добре перевірений, і що хтось ніколи не повинен модернізувати версії чітко.


Ви знизили програму androidx.appcompat: appcompat на 1.1.0-rc01? Не до 1.0.2?
— Жебжик Бабич

Спробував це з 1.0.2, але успіху не було. Повинно бути однією з інших залежностей у поєднанні з appcompat.
— S. Gissel

Просто зниження рівня androidx.appcompat:appcompatмене працювало. Майбутнім читачам: переконайтеся, що "Gradle sync" і переконайтеся, що це недостатньо для вас, перш ніж переносити більше матеріалів.
— користувач1032613

Після зниження не буде зайвим перевірити версії залежностей в проекті stackoverflow.com/a/39020703/6055194
— Zhebzhik Бабич

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 розмістив фрагмент коду, який допоміг нам вирішити проблему. Але переконайтесь, що ви робите це першим stackoverflow.com/a/57715955/2344192
— відображуйте ім'я

2
Будьте уважні, цей спосіб розбиття випадаючих полів та вибору тексту у веб-перегляді.
— user5507535

2

AppCompat 1.2.0-alpha02 випущений сьогодні, тому ви можете використовувати його

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

який виправить проблеми з WebView на Lollipop.


він виправляє проблему, але оскільки це альфа-версія, це може спричинити інші помилки. якщо ви спробували це, чи не стикалися ви з будь-якою іншою проблемою у вашому додатку?
— Soheil

@Soheil Ні, я не зазнав жодних збоїв. Альфа-версії завжди, звичайно, трохи ризиковані. Наприклад, тут згадується помилка альфа02: issueetracker.google.com/isissue/141351441#comment48
— Dimitris Pattas

2

Мені вдалося відтворити цю проблему на API Nexus 7 22. Виправлення виправлено шляхом оновлення версії Android System WebView планшетного ПК з версії 39 (2237560-arm) до версії 79.0.3945.136

Користувач не може контролювати це, але це рішення, якщо вам потрібно допомогти комусь негайно використовувати ваш додаток.


1

Проблема була вирішена для мене шляхом переходу на реалізацію 'androidx.appcompat: appcompat: 1.0.2'


1

У моєму випадку проблема була в методі

fun getUserId(): Int = userId

MainActivity. Я не знаю, чому це впливає WebView. getUserId()не є ні перекритим, ні публічним методом Activityкласу. Якщо я перейменую або видалю цей метод, WebViewпочне відкриватися. Також намагаються змінити

private var userId: Int = 0

до

var userId: Int = 0
    private set

призводить до того ж винятку. Я зрозумів , що , коли він бачив виняток: 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. У цьому випадку користувач = 123456 насправді був моїм авторизованим користувачем, який використовувався в деяких запитах, а не в WebView. Я підозрюю, що Android використовує userIdяк локальний user_id для своїх процесів.

Як багато інших людей помітили, що ми могли б використовувати appcompat:1.1.0або 1.0.2розширити WebViewклас. У емуляторі 21 без сервісів Google Play це WebViewпризведе до кращого дотику до текстових міток, але на типових пристроях все гаразд.


0

Замість того, щоб змінювати версію будь-якої залежності, я застосував програмне генерування webView як рішення.

Проблема насправді виглядає як починаючи з читання макета з файлу xml. Тож, якщо для вас застосовано програмний спосіб, будь ласка, перевірте нижче зразок.

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

Чим просто додати до батьківського подання:

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

-4

Перевірте версію. Додаткова версія Androidx та матеріали Google завжди залишаються однаковими.

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"

введіть тут опис зображення


1
Ви повинні вставити прикладний код безпосередньо у свою відповідь, якщо пізніше пов’язане зображення стане недоступним.
— Луї Шаретт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.