O Android 8.0 Oreo falha ao focar TextInputEditText

100

Depois de atualizar alguns de nossos dispositivos para o Android 8.0, ao focar em um TextInputEditTextcampo dentro de um TextInputLayout, o aplicativo trava com o seguinte Exception:

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'void
android.view.View.getBoundsOnScreen(android.graphics.Rect)' on a null object reference
at android.app.assist.AssistStructure$WindowNode.(AssistStructure.java)
at android.app.assist.AssistStructure.(AssistStructure.java)
at android.app.ActivityThread.handleRequestAssistContextExtras(ActivityThread.java:3035)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1807)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

Quando vamos para Configurações do Android -> Sistema -> Idiomas e entrada -> Avançado -> Serviço de preenchimento automático -> Nenhum , em seguida, enfocando o TextInputEditText / TextInputLayoutnão travamentos.

Como podemos evitar que o travamento aconteça sem ter que desabilitar o novo serviço de preenchimento automático 8.0 nos dispositivos?

Jesobremonte
fonte

Respostas:

186

Eu também corri para isso. Acontece que o problema foi causado pela configuração do texto de dica EditTextaninhado dentro de TextInputLayout.

Eu fiz algumas pesquisas e encontrei este pepino nas notas de lançamento do Beta 2 de 26.0.0. Notas de versão de suporte do Android, junho de 2017

TextInputLayout deve definir dicas em onProvideAutofillStructure ()

Isso me levou a tentar definir a dica no em TextInputLayoutvez do aninhado EditText.

Isso resolveu o problema de travamento para mim. Exemplo:

<android.support.design.widget.TextInputLayout
    android:id="@+id/textInputLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="Some Hint Text"
    android.support.design:hintAnimationEnabled="true"
    android.support.design:hintEnabled="true"
    android.support.design:layout_marginTop="16dp">

    <android.support.design.widget.TextInputEditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</android.support.design.widget.TextInputLayout>

Eu postei isso como uma resposta aqui enquanto confundia os favoritos. Desculpe por postar a mesma resposta duas vezes.

Azethoth
fonte
Isso funcionará sem android.support.design:hintAnimationEnabled e android.support.design:hintEnabled? Eu olhei para a fonte TextInputLayout, ambos os atributos parecem estar definidos como padrão ao carregar atributos.
androidguy
@androidguy sim, deve funcionar sem esses atributos. Esses atributos dizem ao TextInputLayout para alocar espaço no layout para esses itens (ou pelo menos é o que observei)
Azethoth
@Azethoth Esta solução não mantém o comportamento. No meu caso, estou usando-o para animação de rótulo flutuante. Quando eu uso dessa forma, a dica / rótulo não aparece. Tudo o que posso ver é uma entrada de texto
KrishnaCA
@KrishnaCA isso é muito estranho. Eu uso essa abordagem em todo o meu aplicativo e ela mostra a dica no texto de edição e o anima como um rótulo flutuante. Não tenho certeza do que pode estar causando seu problema. Você pode postar um exemplo de código do seu layout xml em uma pergunta e me vincular a ele? Eu ficaria feliz em tentar ajudar.
Azethoth
É o mesmo que postou em sua resposta. O dispositivo que testei é Huawei
KrishnaCA
25

Adicione o atributo mencionado abaixo em EditText:

android:importantForAutofill="noExcludeDescendants"

Gaurav Singh
fonte
O recurso é apenas para API 26. Existe uma solução se seu API mínimo for inferior a 26?
JPM de
2
@JPM Não se preocupe, ele é simplesmente ignorado em níveis de API mais antigos, portanto, não travará ou será um problema.
Pei
2
O problema do @JPM é apenas no Oreo, então será ignorado para APIs mais antigas e não irá travar para elas.
Gaurav Singh
Eu o tenho no PROD agora em meu aplicativo parece estar funcionando bem
JPM
1
Esta é uma solução incorreta. Ele trava quando você pressiona longamente EditText e escolhe Preenchimento automático no menu. Solução correta (embora exija código): stackoverflow.com/a/46698028/1714102
Przemo
11

Luke Simpson quase acertou, apenas deveria usar "styles.xml" em vez de "themes.xml".

Criei um novo arquivo de estilo com qualificador de versão, visando a v26, para deixar mais claro.
Basta copiar e colar AppThemeno v26 / styles.xml e adicionar editTextStyleitens ao EditTextStyleestilo.

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    ...
    <item name="android:editTextStyle">@style/App_EditTextStyle</item>
    <item name="editTextStyle">@style/App_EditTextStyle</item>
</style>

<style name="App_EditTextStyle" parent="@android:style/Widget.EditText">
    <item name="android:importantForAutofill">noExcludeDescendants</item>
</style>

Desta forma, você faz essas alterações para todos os seus EditTexts sem a necessidade de alterar seus arquivos de layout.

Endy Silveira
fonte
1
Observará o requisito mínimo da API e deverá ser colocado na pasta de recursos v26.
StarWind0
6

Você pode definir qualquer valor para importantForAutofill com um estilo ou no XML é corrigido para NPE quando você focaliza o EditText, mas não é corrigido se você pressionar longamente o EditText e clicar em AutoFill. Encontrei um relatório de bug sobre esse bug aqui , por favor, adicione uma estrela e compartilhe suas observações no relatório de bug.

THX.

Nicolas Van Damme
fonte
5

Usei v26 / themes.xml para substituir o preenchimento automático de estilo EditText apenas para Oreo 8.0.0:

<style name="EditTextStyle" parent="Widget.AppCompat.EditText">
    <item name="android:importantForAutofill">noExcludeDescendants</item>
</style>

Observe que eu tive que aplicar o estilo inline para cada EditText em meu layout xml para que ele tivesse efeito. Tentei aplicar essa mudança globalmente no tema do meu aplicativo, mas não funcionou por algum motivo.

// HAD TO DO THIS IN LAYOUT XML FOR EACH EDIT TEXT
<EditText
    style="@style/EditTextStyle"
    ... />


// THIS DIDN'T TAKE EFFECT IN THEMES XML (HAS BEEN ADDED TO MANIFEST)
<style name="APP_THEME" parent="@style/Theme.AppCompat.Light">
    <item name="android:editTextStyle">@style/EditTextStyle</item>
    <item name="editTextStyle">@style/EditTextStyle</item>
</style>
Luke Simpson
fonte
0

@Luke Simpson está certo. Você pode usá-lo em themes.XML como: -

<item name="editTextStyle">@style/AppEditTextStyle</item>

and then put
<style name="AppEditTextStyle" parent="Widget.AppCompat.EditText">
        <item name="android:importantForAutofill">auto</item>
 </style>

em V26 / app_styles.xml

Mas, eu tive que colocar a tag vazia também em app_styles.xml na pasta padrão. Caso contrário, todas as propriedades de Editar texto estavam sendo substituídas por isso e meu texto de edição não estava funcionando corretamente. E quando você coloca a propriedade importantForAutoFill para v26 e deseja que o preenchimento automático funcione na 8.1, pode simplesmente colocar

<style name="AppEditTextStyle" parent="Widget.AppCompat.EditText">
        <item name="android:importantForAutofill">auto</item>
    </style>

Portanto, a propriedade de preenchimento automático funciona em 8.1. Ele será desabilitado apenas no 8.0, pois a falha está ocorrendo no 8.0 e já foi corrigido no 8.1.

Monika Saini
fonte
0

Se alguém ainda quiser " hint " em " TextInputEditText ", faça o app: hintEnabled = "false" em TextInputLayout

<com.google.android.material.textfield.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:hintEnabled="false"
    app:passwordToggleEnabled="true">

    <com.google.android.material.textfield.TextInputEditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="password"
        android:inputType="textPassword" />

</com.google.android.material.textfield.TextInputLayout>
Prakash Bala
fonte
0

Também enfrentei esse problema e finalmente descobrimos o motivo da falha no Android 8.0 e no Android 8.1.

primeira razão (dica importante): dica vazia (android: hint = "") em xml leva a travar no dispositivo oreo. Remova esta dica vazia em editText na pesquisa de projeto inteiro.

segunda razão (igual à explicação acima): certifique-se de que sua dica editText deve ser exibida dentro de TextInputLayout se você tiver usado TextInputLayout, caso contrário, você pode usar hint dentro de editText.

Espero que isso ajude você !!

Obrigado

CHANDAN KUMAR
fonte