Android 8.0 Oreo si arresta in modo anomalo durante la messa a fuoco di TextInputEditText


101

Dopo aver aggiornato alcuni dei nostri dispositivi ad Android 8.0, concentrandoci su un file TextInputEditText campo all'interno di a TextInputLayout, l'app si blocca con questo 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)

Quando andiamo su Impostazioni Android -> Sistema -> Lingue e input -> Avanzate -> Servizio di riempimento automatico -> Nessuno , concentrandoci quindi sul TextInputEditText / TextInputLayoutnon più arresti anomali.

Come possiamo evitare che il crash si verifichi senza dover disabilitare il nuovo servizio di riempimento automatico 8.0 sui dispositivi?


Risposte:


187

Mi sono imbattuto anche in questo. Si scopre che il problema è stato causato dall'impostazione del testo del suggerimento nel file EditTextannidato all'interno del file TextInputLayout.

Ho scavato un po 'e ho trovato questa pepita nelle note di rilascio della beta 2 26.0.0. Note sulla versione del supporto Android giugno 2017

TextInputLayout deve impostare suggerimenti su onProvideAutofillStructure ()

Questo mi ha portato a provare a impostare il suggerimento su TextInputLayoutinvece che su nidificato EditText.

Questo ha risolto il problema di arresto anomalo per me. Esempio:

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

L'ho pubblicato come risposta qui mentre confondevo i segnalibri. Ci scusiamo per aver pubblicato la stessa risposta due volte.


Funzionerà senza android.support.design:hintAnimationEnabled e android.support.design:hintEnabled? Ho esaminato la sorgente TextInputLayout, entrambi gli attributi sembrano essere impostati come predefiniti durante il caricamento degli attributi.
androidguy

@androidguy sì, dovrebbe funzionare senza questi attributi. Questi attributi dicono al TextInputLayout di allocare spazio nel layout per quegli elementi (o almeno questo è quello che ho osservato)
Azethoth

@ Azethoth Questa soluzione non mantiene il comportamento. Nel mio caso, lo sto usando per l'animazione di etichette mobili. Quando lo uso in questo modo, il suggerimento / etichetta non viene visualizzato. Tutto quello che posso vedere è un input di testo
KrishnaCA

@KrishnaCA che è abbastanza strano. Uso questo approccio ovunque nella mia app e mostra il suggerimento nel testo di modifica e lo anima come un'etichetta mobile. Non sono sicuro di quale sia la causa del tuo problema. Puoi pubblicare un esempio di codice del tuo layout xml in una domanda e collegarmi ad esso? Sarei felice di provare ad assistere.
Azethoth

È lo stesso pubblicato nella tua risposta. Il dispositivo che ho provato è Huawei
KrishnaCA

25

Aggiungi l'attributo sotto menzionato nel tuo EditText:

android:importantForAutofill="noExcludeDescendants"


La funzionalità è solo per l'API 26 esiste una soluzione se l'API minima è inferiore a 26?
JPM

2
@ JPM Nessun problema, viene semplicemente ignorato nei livelli API precedenti, quindi non si bloccherà né costituirà un problema.
Pei

2
Il problema con @JPM è solo su Oreo, quindi verrà ignorato per le API meno recenti e non si bloccherà per loro.
Gaurav Singh

Ce l'ho in PROD ora sulla mia app sembra funzionare bene
JPM

1
Questa è una soluzione sbagliata. Si arresta in modo anomalo quando si preme a lungo su Modifica testo e si seleziona Compilazione automatica dal menu. La corretta (anche se richiede il codice) Soluzione: stackoverflow.com/a/46698028/1714102
Przemo

11

Luke Simpson ha quasi risolto il problema, dovrebbe usare "styles.xml" invece di "themes.xml".

Ho creato un nuovo file di stile con qualificatore di versione, con l'obiettivo di v26, per renderlo più chiaro.
Basta copiare e incollare il tuo AppThemeper v26 / styles.xml e aggiungere editTextStyleelementi allo EditTextStylestile.

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

In questo modo puoi apportare queste modifiche a tutti i tuoi EditText senza dover modificare i file di layout.


1
Annoterà il requisito API minimo, dovrà essere inserito nella cartella delle risorse v26.
StarWind0

6

Puoi impostare qualsiasi valore per importantForAutofill con uno stile o nell'XML è corretto per NPE quando metti a fuoco l'EditText ma non è corretto se premi a lungo EditText e fai clic su Compilazione automatica. Ho trovato un bug report su questo bug qui , per favore aggiungi una stella e condividi le tue osservazioni anche nel bug report.

Grazie.


5

Ho usato v26 / temi.xml per sovrascrivere il riempimento automatico in stile EditText solo per Oreo 8.0.0:

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

Si noti che ho dovuto applicare lo stile in linea per ogni EditText nel mio layout xml affinché avesse effetto. Ho provato ad applicare questa modifica a livello globale nel tema della mia app, ma per qualche motivo non ha funzionato.

// 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 ha ragione. Puoi usarlo in temi.XML come: -

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

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

in V26 / app_styles.xml

Ma ho dovuto mettere un tag vuoto anche in app_styles.xml nella cartella predefinita. Altrimenti, tutte le proprietà di Modifica testo venivano sovrascritte da questo e il mio testo di modifica non funzionava correttamente. E quando metti la proprietà importantForAutoFill per v26 e desideri che la compilazione automatica funzioni in 8.1, puoi semplicemente inserire

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

Quindi, la proprietà di compilazione automatica funziona in 8.1. Sarà disabilitato solo per 8.0 poiché il crash si sta verificando in 8.0 ed è già stato risolto in 8.1.


0

Se qualcuno vuole ancora " suggerimento " in " TextInputEditText " crea app: hintEnabled = "false" in 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

Ho anche affrontato questo problema e finalmente abbiamo ottenuto il motivo del crash su Android 8.0 e Android 8.1.

primo motivo (indizio importante): suggerimento vuoto (android: hint = "") in xml causa un arresto anomalo nel dispositivo oreo. Rimuovi questo suggerimento vuoto in editText nella ricerca dell'intero progetto.

secondo motivo (come spiegato sopra): assicurati che il tuo suggerimento editText sia mostrato all'interno di TextInputLayout se hai usato TextInputLayout altrimenti puoi usare il suggerimento all'interno di editText.

Spero che questo ti aiuti !!

Grazie

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.