102 votes

Android 8.0 Oreo se bloque sur la mise au point

Après la mise à jour de certains de nos appareils android 8.0 , mettent l'accent sur un TextInputEditText champ à l'intérieur d'un 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)

Quand nous allons à android Paramètres -> Système -> Langue et saisie -> Avancé -> Auto-remplissage de service -> None , puis en se concentrant sur l' TextInputEditText / TextInputLayout ne se bloque plus.

Comment peut-on empêcher le blocage de passe sans avoir à désactiver le nouveau 8.0 Auto-remplissage de service sur les appareils?

189voto

Azethoth Points 2016

Je suis tombé sur cette trop. Il s'avère que le problème a été causé par le réglage de l'indicateur de texte sur l' EditText imbriquée à l'intérieur de l' TextInputLayout.

J'ai fait quelques recherches et trouvé cette pépite dans la 26.0.0 Bêta 2 notes de version. Android Le Soutien Notes De Version Juin 2017

TextInputLayout devez définir conseils sur onProvideAutofillStructure()

Ce qui m'a conduit à essayer de régler le soupçon sur l' TextInputLayout au lieu de le sous - EditText.

Cette 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é cela comme une réponse ici, comme je l'ai mélangé les signets. Désolé de poster deux fois la même réponse.

25voto

Random Points 1057

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

android:importantForAutofill="noExcludeDescendants"

12voto

Endy Silveira Points 99

Luke Simpson a presque raison, mais devrait 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 editTextStyle éléments 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 à tous vos EditTexts sans avoir à modifier vos fichiers de présentation.

6voto

Vous pouvez régler une valeur pour importantForAutofill avec un style ou dans le XML c'est corrigé pour les NPE lorsque vous vous concentrez l'EditText mais il n'est pas corrigé si votre long sur le EditText et vous cliquez sur remplissage automatique. J'ai trouvé un Rapport de Bogue sur ce bug ici, s'il vous plaît ajouter une étoile et partager vos observations dans le rapport de bug aussi.

Thx.

5voto

Luke Simpson Points 71

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 dans mon layout XML afin que celui-ci 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>
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X