Помилка надування класу 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.