Android 8.0 Oreo stürzt beim Fokussieren von TextInputEditText ab

100

Nach dem Update einiger unserer Geräte auf Android 8.0 stürzt die App ab , wenn Sie sich auf ein TextInputEditTextFeld innerhalb von a konzentrieren :TextInputLayoutException

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)

Wenn wir zu Android- Einstellungen -> System -> Sprachen & Eingabe -> Erweitert -> Auto-Fill-Dienst -> Keine gehen , konzentrieren wir uns auf die TextInputEditText / TextInputLayoutnicht mehr abstürzenden.

Wie können wir den Absturz verhindern, ohne den neuen 8.0 Auto-Fill-Dienst auf den Geräten deaktivieren zu müssen?

jesobremonte
quelle

Antworten:

186

Ich bin auch darauf gestoßen. Es stellt sich heraus, dass das Problem durch das Festlegen des Hinweistextes auf dem EditTextverschachtelten Text im Internet verursacht wurde TextInputLayout.

Ich habe ein bisschen gegraben und dieses Nugget in den Beta-Versionshinweisen zu 26.0.0 Beta 2 gefunden. Versionshinweise zum Android-Support Juni 2017

TextInputLayout muss Hinweise auf onProvideAutofillStructure () setzen.

Das hat mich dazu gebracht, den Hinweis auf das TextInputLayoutanstelle des verschachtelten zu setzen EditText.

Dies löste das Absturzproblem für mich. Beispiel:

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

Ich habe dies als Antwort hier gepostet , als ich Lesezeichen verwechselt habe. Entschuldigen Sie, dass Sie dieselbe Antwort zweimal gepostet haben.

Azethoth
quelle
Funktioniert dies ohne android.support.design:hintAnimationEnabled und android.support.design:hintEnabled? Ich habe mir die TextInputLayout-Quelle angesehen. Beide Attribute scheinen beim Laden von Attributen als Standard festgelegt zu sein.
AndroidGy
@androidguy ja es sollte ohne diese Attribute funktionieren. Diese Attribute weisen das TextInputLayout an, Platz im Layout für diese Elemente zuzuweisen (oder zumindest habe ich dies beobachtet)
Azethoth
@ Azethoth Diese Lösung behält das Verhalten nicht bei. In meinem Fall verwende ich es für Floating-Label-Animationen. Wenn ich es so benutze, erscheint der Hinweis / die Beschriftung nicht. Alles was ich sehen kann ist eine Texteingabe
KrishnaCA
@KrishnaCA das ist ziemlich komisch. Ich verwende diesen Ansatz überall in meiner App und er zeigt den Hinweis im Bearbeitungstext an und animiert ihn als schwebendes Etikett. Ich bin nicht sicher, was Ihr Problem verursachen könnte. Können Sie ein Codebeispiel Ihres XML-Layouts in einer Frage veröffentlichen und mich damit verknüpfen? Ich würde gerne versuchen, Ihnen zu helfen.
Azethoth
Es ist das gleiche wie in Ihrer Antwort. Das Gerät, auf das ich getestet habe, ist Huawei
KrishnaCA
25

Fügen Sie das unten genannte Attribut in Ihr EditText:

android:importantForAutofill="noExcludeDescendants"

Gaurav Singh
quelle
Die Funktion ist nur für API 26 verfügbar. Gibt es eine Lösung, wenn Ihre minimale API weniger als 26 beträgt?
JPM
2
@JPM Keine Sorge, es wird in älteren API-Levels einfach ignoriert, sodass es nicht abstürzt oder ein Problem darstellt.
Pei
2
Das @ JPM-Problem tritt nur bei Oreo auf, sodass es für ältere APIs ignoriert wird und für diese nicht abstürzt.
Gaurav Singh
Ich habe es jetzt in PROD auf meiner App scheint gut zu funktionieren
JPM
1
Dies ist eine falsche Lösung. Es stürzt ab, wenn Sie lange auf EditText drücken und Autofill aus dem Menü auswählen. Richtige (obwohl Code erforderlich) Lösung: stackoverflow.com/a/46698028/1714102
Przemo
11

Luke Simpson macht es fast richtig, sollte nur "styles.xml" anstelle von "theme.xml" verwenden.

Ich habe eine neue Stildatei mit dem Versionsqualifizierer erstellt, die auf Version 26 abzielt, um sie klarer zu machen.
Kopieren Sie AppThemeeinfach Ihre für die v26 / styles.xml und fügen Sie editTextStyleElemente im EditTextStyleStil hinzu.

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

Auf diese Weise nehmen Sie diese Änderungen für alle Ihre EditTexts vor, ohne Ihre Layoutdateien ändern zu müssen.

Endy Silveira
quelle
1
Wird die min API-Anforderung beachten, muss im v26-Ressourcenordner abgelegt werden.
StarWind0
6

Sie können einen beliebigen Wert für " ImportantFutAutofill" mit einem Stil festlegen oder im XML-Format ist es für NPE behoben, wenn Sie den EditText fokussieren. Es ist jedoch nicht behoben, wenn Sie lange auf "EditText" drücken und auf "AutoFill" klicken. Ich habe hier einen Fehlerbericht über diesen Fehler gefunden . Bitte fügen Sie einen Stern hinzu und teilen Sie Ihre Beobachtungen auch im Fehlerbericht mit.

Vielen Dank.

Nicolas Van Damme
quelle
5

Ich habe die Datei v26 / theme.xml verwendet, um das automatische Ausfüllen im EditText-Stil nur für Oreo 8.0.0 zu überschreiben:

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

Beachten Sie, dass ich den Stil inline für jeden EditText in meiner Layout-XML anwenden musste, damit er wirksam wird. Ich habe versucht, diese Änderung global in meinem App-Thema anzuwenden, aber sie hat aus irgendeinem Grund nicht funktioniert.

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

@ Luke Simpson ist richtig. Sie können es in theme.XML verwenden wie: -

<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

Aber ich musste ein leeres Tag auch in app_styles.xml im Standardordner ablegen. Andernfalls wurden alle Eigenschaften von Text bearbeiten außer Kraft gesetzt und mein Bearbeitungstext funktionierte nicht richtig. Wenn Sie die Eigenschaft "importantForAutoFill" für Version 26 einfügen und möchten, dass die automatische Ausfüllung in 8.1 funktioniert, können Sie sie einfach einfügen

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

Die Eigenschaft zum automatischen Ausfüllen funktioniert also in 8.1. Es wird nur für 8.0 deaktiviert, da der Absturz in 8.0 stattfindet und bereits in 8.1 behoben wurde.

Monika Saini
quelle
0

Wenn jemand immer noch " Hinweis " in " TextInputEditText " möchte, machen Sie app: pointeEnabled = "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>
Prakash Bala
quelle
0

Ich habe auch dieses Problem konfrontiert und schließlich haben wir den Grund für den Absturz auf Android 8.0 und Android 8.1.

erster grund (wichtiger hinweis): leerer hinweis (android: hinweis = "") in xml führt zum absturz im oreo gerät. bitte entfernen sie diesen leeren hinweis in editText in der gesamten projektsuche.

Zweiter Grund (wie oben erläutert): Stellen Sie sicher, dass Ihr editText-Hinweis in TextInputLayout angezeigt wird, wenn Sie TextInputLayout verwendet haben. Andernfalls können Sie einen Hinweis in editText verwenden.

Hoffe das hilft dir !!

Danke dir

CHANDAN KUMAR
quelle