Сбой Android 8.0 Oreo при фокусировке TextInputEditText

После обновления некоторых наших устройств до 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 на устройствах?


person jesobremonte    schedule 23.08.2017    source источник
comment
Issuetracker.google.com/issues/62834931   -  person Mike M.    schedule 23.08.2017


Ответы (8)


Я тоже с этим столкнулся. Оказывается, проблема была вызвана установкой текста подсказки на 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>

Я разместил это как ответ здесь как я закладки перепутал. Извините за отправку одного и того же ответа дважды.

person Azethoth    schedule 31.10.2017
comment
Будет ли это работать без android.support.design:hintAnimationEnabled и android.support.design:hintEnabled? Я посмотрел на источник TextInputLayout, оба атрибута, кажется, установлены по умолчанию при загрузке атрибутов. - person androidguy; 22.07.2018
comment
@androidguy да, он должен работать без этих атрибутов. Эти атрибуты сообщают TextInputLayout о выделении места в макете для этих элементов (или, по крайней мере, это то, что я наблюдал) - person Azethoth; 23.07.2018
comment
@Azethoth Это решение не сохраняет поведение. В моем случае я использую его для анимации плавающих меток. Когда я использую его таким образом, подсказка / метка не появляется. Все, что я вижу, это ввод текста - person KrishnaCA; 16.10.2018
comment
@KrishnaCA, это довольно странно. Я использую этот подход повсюду в своем приложении, и он показывает подсказку в тексте редактирования и анимирует его как плавающую метку. Я не уверен, что может вызвать вашу проблему. Можете ли вы опубликовать образец кода вашего XML-макета в вопросе и связать меня с ним? Я был бы рад помочь. - person Azethoth; 16.10.2018
comment
Это то же самое, что написано в вашем ответе. Устройство, которое я тестировал, - это Huawei. - person KrishnaCA; 16.10.2018
comment
@KrishnaCA Интересно, связано ли это с тем, что Huawei делает для своего вкуса Android. Вы тестировали на эмуляторе или другом устройстве? Вы также можете избежать этого сбоя, установив подсказку для текста редактирования в коде. Ошибка проявляется при установке подсказки в xml. - person Azethoth; 16.10.2018
comment
это не только с edittext, мне пришлось удалить подсказку из всех вложенных представлений TextInputLayout - person Prabs; 20.11.2018

Добавьте указанный ниже атрибут в свой EditText:

android:importantForAutofill="noExcludeDescendants"

person Gaurav Singh    schedule 12.09.2017
comment
Функция предназначена только для API 26, есть ли решение, если ваш min API меньше 26? - person JPM; 20.10.2017
comment
@JPM Не беспокойтесь, он просто игнорируется на более старых уровнях API, поэтому он не выйдет из строя и не будет проблемой. - person Pei; 30.10.2017
comment
Проблема @JPM существует только в Oreo, поэтому она будет проигнорирована для более старых API и не приведет к сбою для них. - person Gaurav Singh; 30.10.2017
comment
У меня это сейчас в PROD, в моем приложении все работает нормально - person JPM; 31.10.2017
comment
@JPM Замечательно !! - person Gaurav Singh; 01.11.2017
comment
Это неправильное решение. Он вылетает, когда вы долгое время нажимаете EditText и выбираете в меню Автозаполнение. Правильное (хотя и требует кода) решение: stackoverflow.com/a/46698028/1714102 - person Przemo; 24.11.2017

Люк Симпсон почти все исправил, просто следует использовать "styles.xml" вместо "themes.xml".

Я создал новый файл стиля с квалификатором версии, стремясь к v26, чтобы сделать его более понятным.
Просто скопируйте и вставьте свой AppTheme в файл v26 / styles.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 без необходимости изменять файлы макета.

person Endy Silveira    schedule 05.10.2017
comment
Обратите внимание на минимальные требования к API, которые необходимо разместить в папке ресурсов v26. - person StarWind0; 12.10.2017

Вы можете установить любое значение для importantForAutofill со стилем или в XML это исправление для NPE, когда вы фокусируете EditText, но это не исправление, если вы долго нажимаете EditText и нажимаете AutoFill. Я нашел отчет об этой ошибке здесь, пожалуйста, добавьте звездочку и поделитесь своими наблюдениями в ошибке отчет также.

Спасибо.

person Nicolas Van Damme    schedule 16.10.2017

Я использовал v26 / themes.xml, чтобы переопределить автозаполнение стиля EditText только для Oreo 8.0.0:

<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>
person Luke Simpson    schedule 02.10.2017

@ Люк Симпсон прав. Вы можете использовать его в 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 в папке по умолчанию. В противном случае все свойства текста редактирования переопределялись этим, и мой текст редактирования не работал должным образом. И когда вы помещаете свойство 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.

person Monika Saini    schedule 05.04.2018

Если кому-то по-прежнему нужна "подсказка" в "TextInputEditText", сделайте 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>
person Prakash Bala    schedule 14.08.2019

Я тоже столкнулся с этой проблемой, и, наконец, мы выяснили причину сбоя на Android 8.0 и Android 8.1.

первая причина (важная подсказка): пустая подсказка (android: hint = "") в xml приводит к сбою в устройстве oreo. Удалите эту пустую подсказку в editText при поиске по всему проекту.

Вторая причина (такая же, как объяснение выше): убедитесь, что ваша подсказка editText должна отображаться внутри TextInputLayout, если вы использовали TextInputLayout, иначе вы можете использовать подсказку внутри editText.

Надеюсь, это поможет вам !!

Спасибо

person CHANDAN KUMAR    schedule 28.04.2020