关注TextInputEditText

时间:2017-08-23 13:16:53

标签: android android-edittext android-8.0-oreo android-textinputlayout

将我们的某些设备更新到Android 8.0后,在关注TextInputEditText内的TextInputLayout字段时,应用程序会崩溃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)

当我们去Android 设置 - >系统 - >语言与输入 - >高级 - >自动填充服务 - >无,然后专注于TextInputEditText / TextInputLayout不再崩溃。

如何在不必在设备上停用新的8.0自动填充服务的情况下防止崩溃?

8 个答案:

答案 0 :(得分:172)

我也碰到了这个。事实证明,问题是由EditText嵌套在TextInputLayout内的提示文本引起的。

我做了一些挖掘,并在26.0.0 Beta 2发行说明中找到了这个金块。 Android Support Release Notes June 2017

  

TextInputLayout必须在onProvideAutofillStructure()上设置提示

这促使我尝试在TextInputLayout而不是嵌套EditText上设置提示。

这解决了我的崩溃问题。例如:

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

我将此作为答案here发布,因为我混淆了书签。很抱歉两次发布相同的答案。

答案 1 :(得分:21)

EditText中添加以下提到的属性:

android:importantForAutofill="noExcludeDescendants"

答案 2 :(得分:9)

Luke Simpson几乎做对了,应该使用&#34; styles.xml&#34;而不是&#34; themes.xml&#34;。

我创建了一个带有版本限定符的新样式文件,目标是v26,以使其更清晰。
只需复制并粘贴v26 / styles.xml的AppTheme,然后添加editTextStyle样式的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>

通过这种方式,您可以对所有 EditTexts进行此更改,而无需更改布局文件。

答案 3 :(得分:5)

您可以使用样式设置importantForAutofill的任何值,或者在您关注EditText时为NPE设置XML,但如果您长按EditText并单击自动填充,则无法修复。我发现了一个关于此错误here的错误报告,请添加一个星标并在错误报告中分享您的观察结果。

THX。

答案 4 :(得分:4)

我使用v26 / themes.xml覆盖仅用于Oreo 8.0.0的EditText样式自动填充:

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

请注意,我必须在布局xml中为每个EditText应用内联样式才能使其生效。我尝试在我的应用主题中全局应用此更改,但由于某种原因它无法正常工作。

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

答案 5 :(得分:0)

@Luke Simpson是对的。您可以在themes.XML中使用它,如: -

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

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

在V26 / app_styles.xml

但是,我必须将空标记也放在默认文件夹中的app_styles.xml中。否则,编辑文本的所有属性都会被覆盖,我的编辑文本无法正常工作。 当你为v26放置importantForAutoFill属性并且你希望自动填充在8.1中工作时,你可以简单地把

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

因此,自动填充属性适用于8.1。它将仅在8.0时被禁用,因为崩溃在8.0中已经开始,并且已经在8.1中修复了。

答案 6 :(得分:0)

如果有人仍然想要“ TextInputEditText ”中的“ 提示”,请在 TextInputLayout 中添加 app:hintEnabled =“ false” strong>

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

答案 7 :(得分:0)

我也遇到了这个问题,最后我们得到了android 8.0和android 8.1崩溃的原因。

第一个原因(重要提示):xml中的空提示(android:hint =“”)导致oreo设备崩溃。请在整个项目搜索中删除editText中的空提示。

第二个原因(与上面的解释相同):如果已使用TextInputLayout,请确保您的editText提示应显示在TextInputLayout内,否则可以在editText内使用提示。

希望这对你有帮助!

谢谢