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.