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?
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.
Ajoutez l'attribut mentionné ci-dessous dans votre EditText
:
Android:importantForAutofill="noExcludeDescendants"
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.
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.
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>
@ 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.
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>