Android 8.0 Oreo сбой при фокусировке TextInputEditText
после обновления некоторых из наших устройств на android 8.0, после фокусировки на TextInputEditText
поле внутри a 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 на устройствах?
6 ответов:
я тоже столкнулся с этим. Оказывается, проблема была вызвана установкой текста подсказки на
EditText
внутриTextInputLayout
.Я немного покопался и нашел этот самородок в заметках о выпуске 26.0.0 Beta 2. Заметки О Выпуске Поддержки Android В Июне 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>
я разместил это в качестве ответа здесь как я перепутал закладки. Извините за публикацию одного и того же ответа дважды.
добавить ниже упомянутый атрибут в вашем
EditText
:
android:importantForAutofill="noExcludeDescendants"
Люк Симпсон почти сделать это правильно, просто следует использовать "стили.xml "вместо" темы.XML."
Я создал новый файл стиля с квалификатором версии, направленным на v26, чтобы сделать его более ясным.
Просто скопируйте и вставьте кодAppTheme
для v26 / стилей.XML и добавить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 без необходимости изменять файлы макета.
вы можете установить любое значение importantForAutofill со стилем или в XML это исправление для NPE, когда вы фокусируете EditText, но это не исправление, если вы долго нажимаете EditText и нажимаете на автозаполнение. Я нашел сообщение об ошибке об этой ошибке здесь, пожалуйста, добавьте звезду и поделитесь своими наблюдениями в отчете об ошибке также.
Thx.
я использовал v26 / темы.xml для переопределения автозаполнения стиля EditText только для Oreo 8.0.0:
<style name="EditTextStyle" parent="Widget.AppCompat.EditText"> <item name="android:importantForAutofill">noExcludeDescendants</item> </style>
обратите внимание, что мне пришлось применить стиль inline для каждого 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>
@Люк Симпсон прав. Вы можете использовать его в темах.Как в 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 в папке по умолчанию. В противном случае все свойства редактируемого текста переопределялись этим, и мой редактируемый текст не работал должным образом. И когда вы ставите свойство importantForAutoFill для v26 и хотите, чтобы автозаполнение работало в 8.1, вы можете просто поставить
<style name="AppEditTextStyle" parent="Widget.AppCompat.EditText"> <item name="android:importantForAutofill">auto</item> </style>
Итак, свойство автозаполнения работает в 8.1. Он будет отключен только для 8.0, поскольку сбой происходит в 8.0, и он уже был исправлен в 8.1.