Android 8.0 Oreo 在聚焦 TextInputEditText 时崩溃
Android 8.0 Oreo crash on focusing TextInputEditText
将我们的一些设备更新到 android 8.0 后,在关注 TextInputLayout
内的 TextInputEditText
字段时,应用程序崩溃并显示此 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 设置 -> 系统 -> 语言和输入法 -> 高级 -> 自动填充服务 -> None ,然后关注 TextInputEditText
/
TextInputLayout
不再崩溃。
如何在不禁用设备上新的 8.0 自动填充服务的情况下防止崩溃的发生?
在您的 EditText
中添加以下提到的属性:
android:importantForAutofill="noExcludeDescendants"
我使用 v26/themes.xml 仅针对 Oreo 8.0.0 覆盖 EditText 样式自动填充:
<style name="EditTextStyle" parent="Widget.AppCompat.EditText">
<item name="android:importantForAutofill">noExcludeDescendants</item>
</style>
请注意,我必须为布局中的每个 EditText 应用内联样式 xml 才能生效。我尝试在我的应用程序主题中全局应用此更改,但由于某种原因它不起作用。
// 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 几乎是正确的,只是应该使用 "styles.xml" 而不是 "themes.xml"。
我创建了一个带有版本限定符的新样式文件,针对 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>
通过这种方式,您可以对所有 EditText 进行此更改,而无需更改布局文件。
您可以为 importantForAutofill with a style or in the XML it's fix for NPE when you focus the EditText but it's not fix if your long press the EditText and you click on AutoFill. I found a Bug Report about this bug here 设置任何值,请加星并在错误报告中分享您的观察结果。
谢谢。
我运行也喜欢这个。事实证明,问题是由在嵌套在 TextInputLayout
.
中的 EditText
上设置提示文本引起的
我做了一些挖掘并在 26.0.0 Beta 2 发行说明中找到了这个金块。
Android Support Release Notes June 2017
TextInputLayout must set hints on 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>
我将此作为答案发布 因为我混淆了书签。抱歉将相同的答案发布了两次。
@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 中修复。
如果有人仍然想要“TextInputEditText”中的“hint”,请使app:hintEnabled="false" 在 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>
我也遇到了这个问题,最后我们找到了 android 8.0 和 android 8.1 崩溃的原因。
第一个原因(重要线索):xml 中的空提示(android:hint="")导致 oreo 崩溃 device.Please 整个删除 editText 中的空提示项目搜索。
第二个原因(同上解释):如果你使用了TextInputLayout,请确保你的editText提示应该显示在TextInputLayout中,否则你可以在editText中使用提示。
希望对你有所帮助!!
谢谢
将我们的一些设备更新到 android 8.0 后,在关注 TextInputLayout
内的 TextInputEditText
字段时,应用程序崩溃并显示此 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 设置 -> 系统 -> 语言和输入法 -> 高级 -> 自动填充服务 -> None ,然后关注 TextInputEditText
/
TextInputLayout
不再崩溃。
如何在不禁用设备上新的 8.0 自动填充服务的情况下防止崩溃的发生?
在您的 EditText
中添加以下提到的属性:
android:importantForAutofill="noExcludeDescendants"
我使用 v26/themes.xml 仅针对 Oreo 8.0.0 覆盖 EditText 样式自动填充:
<style name="EditTextStyle" parent="Widget.AppCompat.EditText">
<item name="android:importantForAutofill">noExcludeDescendants</item>
</style>
请注意,我必须为布局中的每个 EditText 应用内联样式 xml 才能生效。我尝试在我的应用程序主题中全局应用此更改,但由于某种原因它不起作用。
// 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 几乎是正确的,只是应该使用 "styles.xml" 而不是 "themes.xml"。
我创建了一个带有版本限定符的新样式文件,针对 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>
通过这种方式,您可以对所有 EditText 进行此更改,而无需更改布局文件。
您可以为 importantForAutofill with a style or in the XML it's fix for NPE when you focus the EditText but it's not fix if your long press the EditText and you click on AutoFill. I found a Bug Report about this bug here 设置任何值,请加星并在错误报告中分享您的观察结果。
谢谢。
我运行也喜欢这个。事实证明,问题是由在嵌套在 TextInputLayout
.
EditText
上设置提示文本引起的
我做了一些挖掘并在 26.0.0 Beta 2 发行说明中找到了这个金块。 Android Support Release Notes June 2017
TextInputLayout must set hints on 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>
我将此作为答案发布
@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 中修复。
如果有人仍然想要“TextInputEditText”中的“hint”,请使app:hintEnabled="false" 在 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>
我也遇到了这个问题,最后我们找到了 android 8.0 和 android 8.1 崩溃的原因。
第一个原因(重要线索):xml 中的空提示(android:hint="")导致 oreo 崩溃 device.Please 整个删除 editText 中的空提示项目搜索。
第二个原因(同上解释):如果你使用了TextInputLayout,请确保你的editText提示应该显示在TextInputLayout中,否则你可以在editText中使用提示。
希望对你有所帮助!!
谢谢