android.view.InflateException Ошибка надувания класса android.webkit.WebView


132

В Lollipop (API 22) каждый раз, когда в моем приложении я показываю веб-просмотр, приложение вылетает. У меня несколько сбоев в консоли разработчика Android, связанных с этим событием.

Не нужно говорить, что он работает на Android 4, 6 и 7.

Читая трассировку стека (размещенную в конце этого поста), что-то меня беспокоит

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

Я безуспешно искал в сгенерированном R.java, очевидно, потому что ID не существует, но попробовать стоило.

Поиск в Google проблемы, похоже, связан с тем, как Lollipop обрабатывает веб-просмотр. Я начал новый 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 нет У меня сейчас нет устройства с леденцом на палочке. Но отчет о сбоях показывает несколько записей для этого.
— Валерио

19
Этот вопрос был задан в 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.
— PampaZiya

11
С этой регрессией связана проблема: Issueetracker.google.com/issues/141132133
— Brais Gabin,

3
Поскольку сегодня переход на более раннюю версию не работает, в моем случае это решение от Issueetracker.google.com/issues/141132133 работает: «Возможно, самый простой способ решить эту проблему - заставить Gradle установить версию 1.1.0- . RC01 Добавьте это в Gradle файл configurations.all {resolutionStrategy {сила '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());
    }
}

РЕДАКТИРОВАТЬ: теперь еще лучше с Kotlin

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 году, и это работает, но я не знаю, почему и как, было бы хорошо, если бы это объяснили. Также я получаю предупреждение «Никогда не используется в четвертом конструкторе" public LollipopFixedWebView (контекст контекста, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
— Дэвид

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

5
Как сказал @DmitryBrant, будьте очень осторожны при реализации этого, потому что это ломает несколько вещей, включая выпадающие поля и долгое нажатие для выделения текста !
— user5507535 03

42

Если вы используете androidx.appcompat:appcompat:1.1.0и не хотите переходить на более раннюю версию androidx.appcompat:appcompat:1.0.2или обновляться до androidx.appcompat:appcompat:1.2.0-alpha03нее, есть еще одно решение, описанное в этом комментарии в Google Issue Tracker.

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

На основе этого комментария вы можете переопределить getAssets()в Activity WebView, чтобы он возвращался getResources().getAssets()вместо этого для решения проблемы.

Ява

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

Котлин

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

3
Отличный ответ +1
— Shirane85

Привет, если бы это было правдой, как бы это было исправлено с выпуском appCompact, который не связан с AssetManager и самим веб-просмотром?
— Sinapse

Глядя на этот список изменений, кажется, что в некоторых версиях веб-просмотра возникают проблемы с applyOverrideConfigurationвызовами внутри библиотеки AppCompat.
— Prawira

34

Мой совет - использовать custom / new 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, переопределите applyOverrideConfiguration в своей деятельности следующим образом. (Примечание: для этого требуется перезапуск приложения при переключении с темной темы на светлую и наоборот).

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 сделать трюк, спасибо
— Talu

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 Webview <50"?
— andrei

20

Если вы не полагаетесь на переключение тем DayNight (или другие события UiMode), вы можете добавить android: configChanges = "uiMode" в манифест активности веб-просмотра, чтобы предотвратить обновление AppCompatDelegate конфигурации ресурсов и тем самым испортить инфляцию веб-просмотра.


Это сработало для меня. Мне нужен ConstraintLayout 1.1.3, для которого требуется appcompat 1.1.0, поэтому возврат невозможен.
— Мэтт Робертсон,

Для меня переход на 1.0.2 не имел никакого значения, но этот метод работал.
— chrisbtoo

классное решение!
— Боян

17

Попробуйте использовать для создания веб-просмотра:

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

а мой xml файл?
— Acauã Pitta

Это решило мою проблему без понижения любой версии библиотеки
— ошибки случаются

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-resources: 1.0.2»
— Мурильо Комино

appcompat-resources недоступны для версии 1.0.2. См. Мой обновленный ответ.
— Мануэль

Спасибо большое, это сработало. Надеюсь, что в будущих версиях это решат.
— Мурильо Комино

5

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

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

3

В качестве побочного примечания, я какое-то время боролся, хотя я снизился до 1.0.2, просто потому, что у меня, казалось, была транзитивная зависимость от appcompat: 1.1.0 через androidx.constraintlayout: constraintlayout: 2.0.0-beta3. Как только я понизил это до constraintlayout: 1.1.3, все работало нормально

(Согласно https://issuetracker.google.com/issues/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 не удалось.

Я понизил все мои ранее обновленные версии androidx с

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меня просто понижение версии сработало. Будущим читателям: убедитесь, что вы выбрали "синхронизацию градиента" и подтвердили, что этого недостаточно для вас, прежде чем переходить на более раннюю версию.
— user1032613


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
Будьте осторожны, этот обходной путь нарушает раскрывающиеся поля и выбор текста в WebView.
— user5507535 03

2

AppCompat 1.2.0-alpha02 был выпущен сегодня, поэтому вы можете использовать

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

который исправит проблемы WebView на Lollipop.


он устраняет проблему, но поскольку это альфа-версия, она может вызвать другие ошибки. Если вы пробовали, не сталкивались ли вы с другими проблемами в своем приложении?
— Soheil

@Soheil Нет, глюков не было. Конечно, альфа-версии всегда немного рискованны. Например, здесь упоминается ошибка alpha02: issueetracker.google.com/issues/141351441#comment48
— Димитрис Паттас,

2

Мне удалось воспроизвести эту проблему на Nexus 7 API 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. В этом случае user = 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.