Android 8.0 Oreo在聚焦TextInputEditText时崩溃


101

将我们的某些设备更新为android 8.0之后,在专注于a 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自动填充服务?


Answers:


187

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

我进行了一些挖掘,并在26.0.0 Beta 2发行说明中找到了这个块。 Android支持发行说明2017年6月

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>

我张贴这作为一个答案在这里,因为我混了书签。抱歉,两次发布相同的答案。


在没有android.support.design:hintAnimationEnabled和android.support.design:hintEnabled的情况下可以使用吗?我查看了TextInputLayout源,加载属性时,两个属性似乎都设置为默认值。
androidguy

@androidguy是的,它应该没有这些属性就可以工作。这些属性告诉TextInputLayout为这些项目分配布局中的空间(或至少是我观察到的)
Azethoth

@Azethoth此解决方案无法保留其行为。就我而言,我将其用于浮动标签动画。当我以这种方式使用它时,提示/标签不会出现。我所看到的只是一个
文本输入

@KrishnaCA太奇怪了。我在应用程序的任何地方都使用了这种方法,它既在编辑文本中显示了提示,又将其动画化为浮动标签。我不确定是什么引起了您的问题。您可以在问题中发布xml布局的代码示例并将其链接到我吗?我很乐意尝试和协助。
Azethoth

与您的答案中发布的内容相同。我测试过的设备是华为
KrishnaCA,2018年

25

在您的中添加以下提到的属性EditText

android:importantForAutofill="noExcludeDescendants"


此功能仅适用于API 26,如果您的最小API小于26,是否有解决方案?
JPM

2
@JPM不用担心,它在较旧的API级别中只是被忽略,因此不会崩溃或成为问题。

2
@JPM问题仅在Oreo上,因此对于较旧的API它将被忽略,并且不会因它们而崩溃。
Gaurav Singh

我现在在我的应用程序中将它保存在PROD中
JPM

1
这是不正确的解决方案。长按EditText并从菜单中选择“自动填充”时,它会崩溃。正确的(尽管需要代码)解决方案:stackoverflow.com/a/46698028/1714102
Przemo

11

卢克·辛普森(Luke Simpson)几乎是正确的,只应使用“ styles.xml”而不是“ themes.xml”。

我针对v26创建了一个带有版本限定符的新样式文件,以使其更加清晰。
只要复制并粘贴AppTheme为V26 / styles.xml和附加editTextStyleEditTextStyle的风格。

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

这样,您无需更改布局文件即可对所有 EditText 进行此更改。


1
将注意最低API要求,将需要放置在v26资源文件夹中。
StarWind0

6

您可以为任意值importantForAutofill与风格或XML它的修为NPE,当你关注的EditText,但它没有,如果你的长按的EditText你点击自动填充修复和。我在这里找到了有关此错误的错误报告,请加一个星号,并在错误报告中分享您的发现。

谢谢。


5

我使用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>

0

@卢克·辛普森(Luke Simpson)是对的。您可以在theme.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的重要属性ForForFill设置为要在8.1中使用自动填充功能时,只需将

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

因此,自动填充属性适用于8.1。由于崩溃在8.0中逐渐减弱,并且已在8.1中修复,因此仅在8.0中将禁用该功能。


0

如果有人还想“ 提示中的”“ TextInputEditText ”制作应用程序:hintEnabled =“假”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

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

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

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

希望这对你有帮助!

谢谢

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.