android.view.InflateException Erro inflating class android.webkit.WebView

132

No Lollipop (API 22), sempre que em meu aplicativo eu mostro um webview, o aplicativo trava. Eu tenho várias falhas no meu console de desenvolvedor Android relacionadas a este evento.

Não é preciso dizer que funciona no Android 4, 6 e 7.

Lendo o stack trace (postado no final deste post), algo me incomoda

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

Procurei no R.java gerado sem sorte, obviamente porque o ID não existe, mas valeu a pena tentar.

Pesquisar o problema no Google parece estar relacionado a como o lollipop lida com a visualização da web. Comecei um novo AVD com pirulito baseado em um dispositivo que encontrei no relator de acidente no GDC, e posso reproduzir o problema.


Rastreamento de pilha completo:

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) 
Valerio
fonte
Parece um WebViewproblema de sistema . Não sei se / quando os emuladores receberão atualizações para isso. Você já experimentou no hardware?
CommonsWare
@commonsware não, não tenho nenhum dispositivo agora com pirulito. Mas o relator do acidente está mostrando várias entradas para isso.
Valerio
18
Esta pergunta é de 2016, mas o problema está surgindo novamente no final de 2019. Se você chegou aqui de uma pesquisa na web, certifique-se de escolher as respostas que se aplicam a você.
user1032613
Não tenho dispositivo físico de API de nível 21. Tentei rodar o app no ​​Genymotion e emuladores Android com API de nível 21, mas travou! Alguém aqui me avise se funcionará no dispositivo físico! Agora meu aplicativo está em risco!
Sumit Shukla
Para mim, o Google Play relatou o problema em um Huawei P8 Lite rodando Android 5.0, mas não apareceu em um Samsung Note 4 real rodando Android 6.0.1 ou um tablet Samsung Note 8 rodando Android 4.4.2.
FractalBob

Respostas:

172

Se você usar androidx.appcompat:appcompat:1.1.0, tente em androidx.appcompat:appcompat:1.0.2vez disso. parece que 1.1.0não corrige o bug WebViewno Android5.1.1 .

Atualização de fevereiro de 2020: Reverter para 1.0.2parar de funcionar para muitas pessoas (incluindo meu aplicativo), mas usar a versão atual do androidx.appcompat:appcompat:1.2.0-alpha02corrigiu a falha. (Eu estava vendo isso em um Huawei P8 Lite rodando Android 5.0 durante o teste automatizado de "Relatório de pré-lançamento" do Google).

Atualização de junho de 2020: há versões mais recentes disponíveis do que a mencionada na atualização de fevereiro de 2020. Você pode ver as versões disponíveis atualmente aqui:

戴 文锦
fonte
3
Existe uma correção de bug para manter 1.1.0 e corrigir isso? Dependemos de algumas coisas que não estão presentes no 1.0.2 e parece que alguma versão alfa ou beta do 1.1.0 não tem esse bug.
PampaZiya
3
Sim, uma limpeza consertada, obrigado! Estou usando o beta01 e tudo parece bem. Vou continuar usando porque não há nenhum benefício óbvio em usar 1.1.0 de qualquer maneira.
PampaZiya
11
Há um problema relacionado a este registro: issuetracker.google.com/issues/141132133
Brais Gabin
3
Como hoje, o downgrade não está funcionando, no meu caso, esta solução de issuetracker.google.com/issues/141132133 funciona: "Talvez a maneira mais simples de resolver esse problema seja forçar o Gradle a definir a versão para 1.1.0- rc01. Adicione isso ao arquivo gradle. configurations.all {resolutionStrategy {force 'androidx.appcompat: appcompat: 1.1.0-rc01'}} "
Talu
3
androidx.appcompat:appcompat:1.2.0-alpha03também funciona
Artyom
45

Aviso: esta solução alternativa também pode interromper algumas coisas; veja os comentários para detalhes

Se quiser aumentar o WebView a partir de um layout XML, você pode envolvê-lo em uma pequena subclasse (com base na resposta de 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());
    }
}

EDITAR: agora ainda melhor com Kotlin

class LollipopFixedWebView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0,
    defStyleRes: Int = 0
) : WebView(context.createConfigurationContext(Configuration()), attrs, defStyleAttr, defStyleRes)
SpaceBison
fonte
1
Encontrei o mesmo problema e usei esta solução para corrigi-lo, obrigado
itsa04g9
Atualizar o Android WebView no dispositivo também corrige o problema
nome de exibição
2
Ainda é um problema em 2019 e funciona, mas não tenho ideia do porquê / como, seria bom se isso fosse explicado. Também recebo o aviso Nunca é usado no 4º construtor "public LollipopFixedWebView (Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
David
4
Apenas uma palavra de cautela sobre esta solução alternativa: instanciar um WebView com um Contexto em branco pode levar a efeitos colaterais indesejados. Por exemplo, ActionModes do WebView provavelmente não funcionará mais (ou seja, pressionar longamente para destacar o texto).
Dmitry Brant
5
Como @DmitryBrant disse, tenha muito cuidado ao implementar isso porque isso quebra algumas coisas, incluindo campos suspensos e pressionamento longo para destacar o texto !
user5507535
42

Se você estiver usando androidx.appcompat:appcompat:1.1.0e não quiser fazer downgrade androidx.appcompat:appcompat:1.0.2ou upgrade para androidx.appcompat:appcompat:1.2.0-alpha03, há outra solução que é descrita neste comentário no Rastreador de problemas do Google.

Notei que depois de chamar applyOverrideConfiguration, Context.getAssets()e Context.getResources().getAssets()não estão retornando o mesmo objeto assetManager. O AssetManager retornado de Context.getAssets()não pode acessar recursos em outros pacotes (incluindo o pacote WebView do sistema), fazendo com que o WebView trave. Se eu cancelar Context.getAssets()para retornar getResources().getAssets(), o problema desaparece.

Com base nesse comentário, você pode substituir o getAssets()na Atividade do WebView para que ele retorne getResources().getAssets()para resolver o problema.

Java

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

Kotlin

override fun getAssets(): AssetManager {
    return resources.assets
}
Prawira
fonte
3
Ótima resposta +1
Shirane85
Olá, se isso fosse verdade, como isso seria corrigido com um lançamento do appCompact que não está relacionado ao AssetManager e ao próprio webview?
Sinapse
Olhando para esta lista de mudanças , parece que algumas versões do webview estão tendo problemas com as applyOverrideConfigurationchamadas dentro da biblioteca AppCompat.
Prawira
34

meu conselho é usar custom / new Configurationapenas quando o "original" estiver causando problemas, portanto, apenas no Lollipop. O código @SpaceBizon funciona bem até o Android 8.x, no 9 e Q (atualmente beta), cada seleção / seleção suspensa não mostra o AlertDialogseletor, em vez de ocorrer vazamento de memória ... corrigido abaixogetFixedContext método com o código de versão adequado "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;
    }
}
snachmsm
fonte
21

Se você estiver usando androidx.appcompat: appcompat: 1.1.0, mude para androidx.appcompat: appcompat: 1.0.2 ou se quiser usar o tema DayNight, substitua applyOverrideConfiguration em sua atividade da seguinte maneira. (Observação: isso requer a reinicialização do aplicativo ao alternar do tema escuro para o tema claro e vice-versa).

override fun applyOverrideConfiguration(overrideConfiguration: Configuration?) {
        if (Build.VERSION.SDK_INT in 21..25 && (resources.configuration.uiMode ==  applicationContext.resources.configuration.uiMode)) {
                return
        }
        super.applyOverrideConfiguration(overrideConfiguration)
}
AR Mythili Saran
fonte
Esta solução alternativa funciona, mas não deveria ser para 21..22, em vez de 21..25? O problema não parece ocorrer na API 23+.
Dmitry Brant
5
Esta é a revisão que causou a falha - android.googlesource.com/platform/frameworks/support/+/… . Assim, de acordo com o código, o travamento ocorrerá na API 21..25 ​​nos dispositivos em que a Google Play Store não está instalada e a versão do Android Webview é <50.
AR Mythili Saran
Fazer downgrade para androidx.appcompat: appcompat: 1.0.2 resolve, obrigado
Talu
3
Minha solução alternativa em java que parece funcionar para mim é a seguinte (desculpe pela formatação horrível, mas não é uma nova resposta, apenas uma porta):@Override public void applyOverrideConfiguration(Configuration overrideConfiguration) { if (Build.VERSION.SDK_INT >= 21 && Build.VERSION.SDK_INT <= 25) { return; } super.applyOverrideConfiguration(overrideConfiguration); }
Mike Hardy
@ARMythiliSaran por que você diz que isso ocorre apenas em "os dispositivos nos quais o Google Play Store não está instalado e a versão do Android Webview é <50"?
andrei
20

Se você não está dependendo da troca de tema DayNight (ou outros eventos UiMode), pode adicionar android: configChanges = "uiMode" ao manifesto de atividade do webview para evitar que AppCompatDelegate atualize a configuração de Recursos e, assim, atrapalhe a inflação do webview.

S. Gissel
fonte
Isso funcionou para mim. Preciso do ConstraintLayout 1.1.3, que requer appcompat 1.1.0, portanto, reverter não era uma opção.
Matt Robertson
O downgrade para 1.0.2 não fez diferença para mim, mas este método funcionou.
chrisbtoo
solução incrível!
bojan
17

Tente usar para criar webview:

mWebView = new WebView(getActivity().createConfigurationContext(new Configuration()));
ikostet
fonte
e meu arquivo xml?
Acauã Pitta
Isso resolveu meu problema, sem fazer downgrade de nenhuma versão da biblioteca
Bugs acontecem em
10

E mais uma tentativa de resolver o problema. Deve substituir este método em sua atividade:

    @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);
    }
HotIceCream
fonte
5

Consegui reproduzir a falha na API 21 no emulador.

Tentei adicionar isso à implementação, conforme descrito nos documentos :

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

Acrescentando appcompat-resourcesque não corrigir o problema.

Talvez uma versão futura funcione, mas eu gostaria de mencionar que parece haver uma biblioteca de recursos complementares que supostamente resolverá esse problema. Então, ao tentar corrigir isso com uma nova versão do appcompat, adicione oappcompat-resources biblioteca com a mesma versão.

Reverter para androidx.appcompat:appcompat:1.0.2corrigiu o problema como uma solução alternativa.

Manuel
fonte
Não consegui reverter "androidx.appcompat:appcompat-resources:$appcompat_version"para a versão 1.0.2. "ERROR: Failed to resolve: androidx.appcompat: appcompat-resources: 1.0.2"
Murillo Comino
appcompat-resources não está disponível para 1.0.2. Veja minha resposta atualizada.
Manuel
Muito obrigado, funcionou. Espero que em versões futuras resolva isso.
Murillo Comino
5

O código a seguir resolverá o problema. Adicione-o ao seu Activity:

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

Apenas como uma observação lateral, eu lutei por um tempo mesmo tendo feito o downgrade para 1.0.2, apenas porque parecia ter uma dependência transitiva para appcompat: 1.1.0 via androidx.constraintlayout: constraintlayout: 2.0.0-beta3. Depois de rebaixar para layout de restrição: 1.1.3 tudo funcionou bem

(De acordo com https://issuetracker.google.com/issues/141351441, o problema será corrigido em breve com appcompat: 1.2.0-alpha02)

Jens Schmitt
fonte
3

Usei a versão mais recente desta fonte . Verifique e use o seu próprio com base no que você acha que é o melhor.

Caso você queira pular, a implementação abaixo resolve o problema:

implementation 'androidx.appcompat:appcompat:1.2.0-beta01'
F.Mysir
fonte
2

戴 文锦 era certo para mim também. Mas o downgrade apenas de androidx.appcompat: appcompat: 1.1.0 para 1.0.2 não teve êxito.

Eu fiz downgrade de todas as minhas versões do androidx atualizadas anteriormente de

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'

de volta a

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'

Um lembrete de que o código do Google de longe não está livre de bugs e é bem testado e que ninguém deve atualizar as versões levianamente.

S. Gissel
fonte
Você desatualizou androidx.appcompat: appcompat para 1.1.0-rc01? Não para 1.0.2?
Zhebzhik Babich
Tentei com 1.0.2 mas sem sucesso. Deve ser uma das outras dependências em combinação com appcompat.
S. Gissel
Simplesmente rebaixar androidx.appcompat:appcompatfuncionou para mim. Para futuros leitores: certifique-se de "sincronização gradle" e confirme se não é suficiente para você, antes de fazer downgrade de mais coisas.
user1032613
Após o downgrade, não será supérfluo verificar as versões das dependências no projeto stackoverflow.com/a/39020703/6055194
Zhebzhik Babich,
2
/**
 * Customized WebView to avoid crashing on Android 5 and 6 (API level 21 to 23)
 * If the Android System WebView is old and is not updated, the WebView view inflation fails.
 * To reproduce the issue, try on OS 5 or 6 with Android System WebView 72.0.3626.76 (this version is just a reference point from being which we saw no crashes)
 */
class BrilliantWebView : WebView {

   companion object {
       private fun getBrilliantContext(context: Context?) =
            if (!OSUtils.hasNougat()) // OS < 24 or OS < 7.0
                context?.createConfigurationContext(Configuration())
            else
                context
    }

   constructor(context: Context?) : super(getBrilliantContext(context))
   constructor(context: Context?, attrs: AttributeSet?) : super(getBrilliantContext(context), attrs)
   constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(getBrilliantContext(context), attrs, defStyleAttr)
}
Nome em Exibição
fonte
@ sumit-shukla postando o snippet de código que nos ajudou a resolver o problema. Mas certifique-se de fazer isso primeiro stackoverflow.com/a/57715955/2344192
nome de exibição
2
Tenha cuidado, esta solução alternativa divide os campos suspensos e a seleção de texto no WebView.
user5507535
2

AppCompat 1.2.0-alpha02 foi lançado hoje, então você pode usar

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

que corrigirá os problemas do WebView no Lollipop.

Dimitris Pattas
fonte
ele corrige o problema, mas como é a versão alfa, pode causar outros bugs. se você já tentou, não encontrou nenhum outro problema em seu aplicativo?
Soheil
@Soheil Não, não tive nenhuma falha. As versões alfa são sempre um pouco arriscadas, é claro. Por exemplo, um bug para alpha02 é mencionado aqui: issuetracker.google.com/issues/141351441#comment48
Dimitris Pattas
2

Consegui reproduzir esse problema em um Nexus 7 API 22. O problema foi corrigido com a atualização da versão do tablet do Android System WebView da versão 39 (2237560-arm) para a versão 79.0.3945.136

Não estou sob meu controle para um usuário fazer isso, mas é uma solução se você precisar ajudar alguém a usar seu aplicativo imediatamente.

TGruenwald
fonte
1

O problema foi resolvido para mim fazendo o downgrade para a implementação 'androidx.appcompat: appcompat: 1.0.2'

Cinza
fonte
1

No meu caso, um problema estava no método

fun getUserId(): Int = userId

de uma MainActivity. Não sei por que isso afeta WebView. getUserId()não é substituído, nem método público da Activityclasse. Se eu renomear ou remover este método, WebViewcomeça a abrir. Também tentando mudar

private var userId: Int = 0

para

var userId: Int = 0
    private set

leva à mesma exceção. Eu entendi que, quando tinha visto uma exceção: 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. Nesse caso, user = 123456 era de fato meu usuário autorizado, que foi usado em algumas solicitações, não em WebView. Eu suspeito que o Android usauserId como um user_id local para seus processos.

Como muitas outras pessoas notaram, poderíamos usar appcompat:1.1.0ou 1.0.2e estender a WebViewaula. No emulador 21 sem o Google Play Services isso WebViewirá travar no toque longo sobre rótulos de texto, mas em dispositivos típicos está tudo bem.

CoolMind
fonte
0

Em vez de alterar a versão de qualquer dependência, implementei a geração de webView de maneira programática como solução.

O problema realmente parece começar com a leitura do layout do arquivo xml. Portanto, se a forma programática é a solução aplicável para você, verifique o exemplo abaixo.

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

Do que apenas adicionar em sua visualização pai:

LinearLayout scrollContainer = findViewById(R.id.scrollContainer);
scrollContainer.addView(generateWebView());
Rıdvan Nuri Göçmen
fonte
-4

Verifique a versão. Androidx appcompat e Google material version são mantidos sempre iguais.

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"

insira a descrição da imagem aqui

Mahmudul hasan Muhib
fonte
1
Você deve colar o código de exemplo diretamente em sua resposta, caso a imagem vinculada fique indisponível posteriormente.
Louis Charette