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?

jesobremonte
la source

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.

Azethoth
la source
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"

Gaurav Singh
la source
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.

Endy Silveira
la source
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.

Nicolas Van Damme
la source
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>
Luke Simpson
la source
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.

Monika Saini
la source
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>
Prakash Bala
la source
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

CHANDAN KUMAR
la source