Crash d'Android 8.0 Oreo sur la focalisation de TextInputEditText


101

Après avoir mis à jour certains de nos appareils vers Android 8.0, en vous concentrant sur un TextInputEditTextchamp à l'intérieur d'un TextInputLayout, l'application se bloque avec ceci 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 Paramètres Android -> Système -> Langues et saisie -> Avancé -> Service de remplissage automatique -> Aucun , puis en se concentrant sur les TextInputEditText / TextInputLayoutplantages 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?


Réponses:


187

J'ai rencontré ça aussi. Il s'avère que le problème a été causé par la définition du texte d'indication sur le EditTextfichier imbriqué dans le TextInputLayout.

J'ai fouillé et j'ai trouvé cette pépite dans les notes de publication de la version 26.0.0 Beta 2. Notes de version du support Android Juin 2017

TextInputLayout doit définir des indicateurs sur onProvideAutofillStructure ()

Cela m'a amené à essayer de définir l'indication sur le TextInputLayoutplutôt que sur l'imbrication EditText.

Cela a résolu le problème de plantage 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 réponse ici en mélangeant des signets. Désolé d'avoir publié la même réponse deux fois.


Cela fonctionnera-t-il sans android.support.design:hintAnimationEnabled et android.support.design:hintEnabled? J'ai regardé la source TextInputLayout, les deux attributs semblent être définis par défaut lors du chargement des attributs.
androidguy

@androidguy oui cela devrait fonctionner sans ces attributs. Ces attributs indiquent au TextInputLayout d'allouer de l'espace dans la mise en page pour ces éléments (ou du moins c'est ce que j'ai observé)
Azethoth

@Azethoth Cette solution ne conserve pas le comportement. Dans mon cas, je l'utilise pour l'animation d'étiquettes flottantes. Lorsque je l'utilise de cette façon, l'indication / l'étiquette n'apparaît pas. Tout ce que je peux voir est une entrée de texte
KrishnaCA

@KrishnaCA c'est assez bizarre. J'utilise cette approche partout dans mon application et elle montre à la fois l'indice dans le texte d'édition et l'anime comme une étiquette flottante. Je ne suis pas sûr de la cause de votre problème. Pouvez-vous publier un exemple de code de votre mise en page XML dans une question et me lier à celui-ci? Je serais heureux d'essayer d'aider.
Azethoth

C'est la même chose que celle publiée dans votre réponse. L'appareil que j'ai testé est Huawei
KrishnaCA

25

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

android:importantForAutofill="noExcludeDescendants"


La fonctionnalité est uniquement pour l'API 26, y a-t-il une solution si votre API minimale est inférieure à 26?
JPM

2
@JPM Pas de soucis, il est simplement ignoré dans les anciens niveaux d'API, donc il ne plantera pas ou ne posera pas de problème.
Pei

2
Le problème @JPM concerne uniquement Oreo, il sera donc ignoré pour les API plus anciennes et ne plantera pas pour elles.
Gaurav Singh

Je l'ai dans PROD maintenant sur mon application semble fonctionner très bien
JPM

1
C'est une solution incorrecte. Il se bloque lorsque vous appuyez longuement sur EditText et choisissez Remplissage automatique dans le menu. Solution correcte (bien que nécessitant du code): stackoverflow.com/a/46698028/1714102
Przemo

11

Luke Simpson a presque réussi, il devrait simplement utiliser "styles.xml" au lieu de "themes.xml".

J'ai créé un nouveau fichier de style avec un qualificatif de version, visant à v26, pour le rendre plus clair.
Copiez et collez simplement votre AppThemepour le v26 / styles.xml et ajoutez des editTextStyleéléments au EditTextStylestyle.

<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 effectuez ces modifications pour tous vos EditTexts sans avoir à modifier vos fichiers de mise en page.


1
Notera l'exigence minimale de l'API, devra placer dans le dossier de ressources v26.
StarWind0

6

Vous pouvez définir n'importe quelle valeur pour importantForAutofill avec un style ou dans le XML, il est corrigé pour NPE lorsque vous vous concentrez sur EditText, mais ce n'est pas corrigé si vous appuyez longuement sur EditText et que vous cliquez sur AutoFill. J'ai trouvé un rapport de bogue à propos de ce bogue ici , veuillez ajouter une étoile et partager vos observations dans le rapport de bogue également.

THX.


5

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

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

Notez que j'ai dû appliquer le style en ligne pour chaque EditText dans ma mise en page xml pour qu'il prenne effet. J'ai essayé d'appliquer ce changement globalement dans le thème de mon 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>

0

@Luke Simpson a raison. Vous pouvez l'utiliser dans des thèmes.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, j'ai dû mettre une balise vide également dans app_styles.xml dans le dossier par défaut. Sinon, toutes les propriétés de Modifier le texte étaient remplacées par cela et mon texte d'édition ne fonctionnait pas correctement. Et lorsque vous mettez la propriété importantForAutoFill pour la v26 et que vous voulez que le remplissage automatique fonctionne dans 8.1, vous pouvez simplement mettre

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

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


0

Si quelqu'un veut toujours un " indice " dans " TextInputEditText ", créez l' application: 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

J'ai également rencontré ce problème et nous avons enfin la raison du crash sur Android 8.0 et Android 8.1.

première raison (indice important): un indice vide (android: hint = "") dans xml entraîne un crash dans le périphérique oreo. Veuillez supprimer cet indice vide dans editText dans la recherche de projet dans son ensemble.

deuxième raison (la même que celle expliquée ci-dessus): assurez-vous que votre indice editText doit être affiché dans TextInputLayout si vous avez utilisé TextInputLayout sinon vous pouvez utiliser l'indice dans editText.

J'espère que cela vous aidera !!

Je vous remercie

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.