Android 8.0 Oreo falla al enfocar TextInputEditText

100

Después de actualizar algunos de nuestros dispositivos a Android 8.0, al enfocarse en un TextInputEditTextcampo dentro de a TextInputLayout, la aplicación falla con esto 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)

Cuando vamos a Configuración de Android -> Sistema -> Idiomas y entrada -> Avanzado -> Servicio de autocompletar -> Ninguno , luego nos enfocamos en los TextInputEditText / TextInputLayoutbloqueos ya no.

¿Cómo podemos evitar que ocurra el bloqueo sin tener que deshabilitar el nuevo servicio 8.0 Autocompletar en los dispositivos?

jesobremonte
fuente

Respuestas:

186

También me encontré con esto. Resulta que el problema se debió al establecimiento del texto de sugerencia en el EditTextanidado dentro del TextInputLayout.

Investigué un poco y encontré esta pepita en las notas de la versión 26.0.0 Beta 2. Notas de la versión de soporte de Android de junio de 2017

TextInputLayout debe establecer sugerencias en onProvideAutofillStructure ()

Eso me llevó a intentar establecer la pista en el en TextInputLayoutlugar de en el anidado EditText.

Esto resolvió el problema de bloqueo para mí. Ejemplo:

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

Publiqué esto como una respuesta aquí mientras confundía los marcadores. Perdón por publicar la misma respuesta dos veces.

Azethoth
fuente
¿Funcionará sin android.support.design:hintAnimationEnabled y android.support.design:hintEnabled? Miré la fuente de TextInputLayout, ambos atributos parecen estar configurados como predeterminados al cargar atributos.
androidguy
@androidguy sí, debería funcionar sin esos atributos. Esos atributos le dicen al TextInputLayout que asigne espacio en el diseño para esos elementos (o al menos eso es lo que he observado)
Azethoth
@Azethoth Esta solución no conserva el comportamiento. En mi caso, lo estoy usando para la animación de etiquetas flotantes. Cuando lo uso de esta manera, la sugerencia / etiqueta no aparece. Todo lo que puedo ver es una entrada de texto
KrishnaCA
@KrishnaCA eso es bastante extraño. Utilizo este enfoque en todas partes de mi aplicación y muestra la sugerencia en el texto de edición y la anima como una etiqueta flotante. No estoy seguro de qué puede estar causando su problema. ¿Puede publicar una muestra de código de su diseño xml en una pregunta y vincularme a ella? Estaría feliz de intentar ayudar.
Azethoth
Es lo mismo que se publicó en su respuesta. El dispositivo que probé es Huawei
KrishnaCA
25

Agregue el atributo mencionado a continuación en su EditText:

android:importantForAutofill="noExcludeDescendants"

Gaurav Singh
fuente
La función es solo para API 26, ¿hay una solución si su API mínima es menor que 26?
JPM
2
@JPM No se preocupe, simplemente se ignora en los niveles de API anteriores, por lo que no se bloqueará ni será un problema.
Pei
2
El problema de @JPM solo está en Oreo, por lo que se ignorará para las API más antiguas y no se bloqueará para ellas.
Gaurav Singh
Lo tengo en PROD ahora en mi aplicación parece estar funcionando bien
JPM
1
Ésta es una solución incorrecta. Se bloquea cuando mantiene presionado EditText y elige Autocompletar en el menú. Solución correcta (aunque requiere código): stackoverflow.com/a/46698028/1714102
Przemo
11

Luke Simpson casi lo hace bien, solo debería usar "styles.xml" en lugar de "themes.xml".

Creé un nuevo archivo de estilo con calificador de versión, con el objetivo de v26, para hacerlo más claro.
Simplemente copie y pegue su AppThemepara v26 / styles.xml y agregue editTextStyleelementos al EditTextStyleestilo.

<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 esta manera, realiza estos cambios para todos sus EditTexts sin necesidad de cambiar sus archivos de diseño.

Endy Silveira
fuente
1
Notará el requisito mínimo de API, deberá colocarlo en la carpeta de recursos v26.
StarWind0
6

Puede establecer cualquier valor para importantForAutofill con un estilo o en el XML se corrige para NPE cuando enfoca EditText, pero no se corrige si mantiene presionado EditText y hace clic en Autocompletar. Encontré un informe de error sobre este error aquí , agregue una estrella y comparta sus observaciones en el informe de error también.

Gracias.

Nicolas Van Damme
fuente
5

Usé v26 / themes.xml para anular el autocompletado de estilo EditText solo para Oreo 8.0.0:

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

Tenga en cuenta que tuve que aplicar el estilo en línea para cada EditText en mi diseño xml para que surta efecto. Traté de aplicar este cambio globalmente en el tema de mi aplicación, pero no funcionó por alguna razón.

// 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
fuente
0

@Luke Simpson tiene razón. Puedes usarlo en themes.XML como: -

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

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

en V26 / app_styles.xml

Pero tuve que poner una etiqueta vacía también en app_styles.xml en la carpeta predeterminada. De lo contrario, todas las propiedades de Editar texto se anulaban por esto y mi texto de edición no funcionaba correctamente. Y cuando pones la propiedad importantForAutoFill para v26 y quieres que el autocompletado funcione en 8.1, simplemente puedes poner

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

Entonces, la propiedad de autocompletar funciona en 8.1. Se desactivará solo para 8.0, ya que el bloqueo se está produciendo en 8.0 y ya se ha solucionado en 8.1.

Monika Saini
fuente
0

Si alguien todavía quiere " pista " en " TextInputEditText ", haga la aplicación: hintEnabled = "false" en 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
fuente
0

También me he enfrentado a este problema y finalmente obtuvimos la razón del bloqueo en Android 8.0 y Android 8.1.

primera razón (pista importante): pista vacía (android: hint = "") en xml conduce a fallar en el dispositivo oreo. Elimine esta pista vacía en editText en la búsqueda de todo el proyecto.

segunda razón (igual que la explicación anterior): asegúrese de que su sugerencia editText se muestre dentro de TextInputLayout si ha usado TextInputLayout, de lo contrario, puede usar la sugerencia dentro de editText.

¡Espero que esto te ayude!

Gracias

CHANDAN KUMAR
fuente