web-dev-qa-db-ger.com

Android 8.0 Oreo-Absturz beim Fokussieren von TextInputEditText

Nachdem wir einige unserer Geräte auf Android 8.0 aktualisiert haben, stürzt sich die App mit einem TextInputEditText-Feld innerhalb einer TextInputLayout ab und stürzt mit dieser Exception ab:

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 wechseln, stürzt die Konzentration auf die TextInputEditText/TextInputLayout nicht mehr ab.

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

87
jesobremonte

Ich bin auch darauf gestoßen. Es stellt sich heraus, dass das Problem durch das Setzen des Hinweistextes in der EditText innerhalb der TextInputLayout verursacht wurde.

Ich habe ein wenig gegraben und dieses Nugget in den Versionshinweisen für 26.0.0 Beta 2 gefunden Android-Versionshinweise für Juni 2017

TextInputLayout muss Hinweise auf onProvideAutofillStructure () setzen

Deshalb habe ich versucht, den Hinweis auf die TextInputLayout statt auf die verschachtelte EditText zu setzen. 

Dies hat das Absturzproblem für mich gelöst. 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 gepostet here , als ich die Lesezeichen gemischt habe. Es tut uns leid, dass Sie dieselbe Antwort zweimal gepostet haben.

166
Azethoth

Fügen Sie das unten angegebene Attribut in Ihrer EditText hinzu:

Android:importantForAutofill="noExcludeDescendants"

20
Random

Luke Simpson macht es fast richtig, sollte statt "themes.xml" nur "styles.xml" verwenden.

Ich habe eine neue Style-Datei mit Versionsqualifizierer erstellt, die auf v26 abzielt, um sie klarer zu machen. 
Kopieren Sie einfach Ihre AppTheme für v26/styles.xml und fügen Sie editTextStyle-Elemente den EditTextStyle-Stil 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 all Ihrer EditTexts vor, ohne Ihre Layoutdateien ändern zu müssen.

8
Endy Silveira

Sie können einen beliebigen Wert für importantForAutofill mit einem Stil oder in der XML-Datei festlegen. Es ist ein Fixpunkt für NPE. Ich habe einen Fehlerbericht zu diesem Fehler gefunden hier , fügen Sie bitte einen Stern hinzu und teilen Sie Ihre Beobachtungen im Fehlerbericht mit.

Vielen Dank.

5

Ich habe die Datei v26/themes.xml verwendet, um die automatische Editierung des EditText-Stils 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-Design anzuwenden, aber aus irgendeinem Grund hat es 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>
4
Luke Simpson

@Luke Simpson hat recht. Sie können es in Themes verwenden. XML 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

Ich musste aber auch das leere Tag in app_styles.xml im Standardordner ablegen. Andernfalls wurden alle Eigenschaften von Text bearbeiten dadurch überschrieben, und mein Bearbeitungstext funktionierte nicht ordnungsgemäß .. Wenn Sie die importantForAutoFill -Eigenschaft für v26 eingeben und Autofill in 8.1 funktionieren soll, können Sie es einfach einfügen

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

Die Autofill-Eigenschaft funktioniert also in 8.1. Es wird nur für 8.0 deaktiviert, da der Absturz in 8.0 abläuft und bereits in 8.1 behoben wurde.

0
Monika Saini

Wenn noch jemand "hint" in "TextInputEditText" machen möchte 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
Prakash Bala