web-dev-qa-db-fra.com

Android 8.0 crash Oreo sur la focalisation de TextInputEditText

Après avoir mis à jour certains de nos appareils sur Android 8.0, après s'être concentré sur un champ TextInputEditText à l'intérieur d'une TextInputLayout, l'application se bloque avec cette 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)

Lorsque nous allons dans Android Paramètres -> Système -> Langues et saisie -> Avancé -> Service de remplissage automatique -> Aucun , nous nous concentrons ensuite sur la TextInputEditText/TextInputLayout ne se bloque plus.

Comment pouvons-nous empêcher le crash de se produire sans avoir à désactiver le nouveau service de remplissage automatique 8.0 sur les appareils?

87
jesobremonte

Je suis tombé dessus aussi. Il s’avère que le problème a été causé par l’affectation du texte d’indication à la variable EditText imbriquée dans la variable TextInputLayout.

J'ai fait quelques recherches et ai trouvé cette pépite dans les notes de publication de la version 26.0.0 Bêta 2 . Notes de publication de l'assistance Android Juin 2017

TextInputLayout doit définir des astuces sur onProvideAutofillStructure ()

Cela m’a amené à essayer de définir l’indice sur la TextInputLayout au lieu de la EditText imbriquée. 

Cela a résolu le problème de crash pour moi. Exemple:

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

J'ai posté ceci comme une réponse ici alors que je mélangeais des signets. Désolé d'avoir posté la même réponse deux fois.

166
Azethoth

Ajoutez l'attribut mentionné ci-dessous dans votre EditText:

Android:importantForAutofill="noExcludeDescendants"

20
Random

Luke Simpson a presque raison, il suffit d’utiliser "styles.xml" au lieu de "themes.xml".

J'ai créé un nouveau fichier de style avec un qualificateur de version, visant à la v26, pour le rendre plus clair. 
Copiez et collez simplement votre AppTheme pour v26/styles.xml et ajoutez les éléments editTextStyle au style EditTextStyle.

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

De cette façon, vous apportez ces modifications à all à vos EditTexts sans avoir à modifier vos fichiers de présentation.

8
Endy Silveira

Vous pouvez définir n'importe quelle valeur pour importantForAutofill avec un style ou, dans le code XML, le problème est résolu pour NPE lorsque vous focalisez le texte d'édition, mais ce n'est pas le cas si vous appuyez longuement sur le texte d'édition et que vous cliquez sur le remplissage automatique. J'ai trouvé un rapport de bogue sur ce bogue ici , ajoutez s'il vous plaît une étoile et partagez vos observations dans le rapport de bogue également.

THX.

5
Nicolas Van Damme

J'ai utilisé v26/themes.xml pour remplacer le remplissage automatique de style EditText uniquement pour Oreo 8.0.0:

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

Notez que je devais appliquer le style en ligne pour chaque EditText de mon layout XML afin que celui-ci prenne effet. J'ai essayé d'appliquer ce changement globalement à mon thème d'application, mais cela n'a pas fonctionné pour une raison quelconque.

// 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>
4
Luke Simpson

@ Lucas Simpson a raison. Vous pouvez l'utiliser dans themes.XML comme: -

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

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

dans V26/app_styles.xml

Mais, je devais mettre une balise vide également dans app_styles.xml dans le dossier par défaut. Sinon, toutes les propriétés du texte d'édition étaient écrasées par là et mon texte d'édition ne fonctionnait pas correctement .

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

Ainsi, la propriété de remplissage automatique fonctionne en 8.1. Il ne sera désactivé que pour la version 8.0, car le crash se produit dans la version 8.0 et a déjà été corrigé dans la version 8.1.

0
Monika Saini

Si quelqu'un veut toujours "indice" dans "TextInputEditText" make app: hintEnabled = "false" dans 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>
0
Prakash Bala