После обновления некоторых наших устройств до 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 на устройствах?
Ответы:
Я тоже столкнулся с этим. Оказывается, проблема была вызвана установкой текста подсказки для
EditText
вложенных внутриTextInputLayout
.Я покопался и нашел этот самородок в примечаниях к выпуску 26.0.0 Beta 2. Примечания к выпуску поддержки Android, июнь 2017 г.
Это побудило меня попробовать установить подсказку
TextInputLayout
вместо вложенногоEditText
.Это решило проблему сбоя для меня. Пример:
Я разместил это как ответ здесь, так как перепутал закладки. Извините за отправку одного и того же ответа дважды.
источник
Добавьте указанный ниже атрибут в свой
EditText
:android:importantForAutofill="noExcludeDescendants"
источник
Люк Симпсон почти все исправил, просто следует использовать "styles.xml" вместо "themes.xml".
Я создал новый файл стиля с квалификатором версии, стремясь к v26, чтобы сделать его более понятным.
Просто скопируйте и вставьте свой
AppTheme
файл v26 / styles.xml и добавьтеeditTextStyle
элементыEditTextStyle
стиля.Таким образом, вы вносите эти изменения для всех ваших EditTexts без необходимости изменять файлы макета.
источник
Вы можете установить любое значение для importantForAutofill со стилем или в XML, это исправление для NPE, когда вы фокусируете EditText, но это не исправлено, если вы долго нажимаете EditText и нажимаете на AutoFill. Я нашел ошибку Сообщить об этой ошибке здесь , пожалуйста , добавьте звезду и поделиться своими наблюдениями в сообщении об ошибке также.
Спасибо.
источник
Я использовал v26 / themes.xml, чтобы переопределить автозаполнение стиля EditText только для Oreo 8.0.0:
Обратите внимание, что мне пришлось применить встроенный стиль для каждого EditText в моем макете xml, чтобы он вступил в силу. Я попытался применить это изменение глобально в своей теме приложения, но по какой-то причине это не сработало.
источник
@ Люк Симпсон прав. Вы можете использовать его в themes.XML, например: -
в V26 / app_styles.xml
Но мне пришлось поместить пустой тег также в app_styles.xml в папке по умолчанию. В противном случае все свойства текста редактирования переопределялись этим, и мой текст редактирования не работал должным образом. И когда вы помещаете свойство importantForAutoFill для v26 и хотите, чтобы автозаполнение работало в 8.1, вы можете просто указать
Итак, свойство автозаполнения работает в 8.1. Он будет отключен только для версии 8.0, так как сбой происходит в версии 8.0, и это уже было исправлено в 8.1.
источник
Если кто-то все еще хочет " подсказку " в " TextInputEditText ", сделайте app: hintEnabled = "false" в TextInputLayout
источник
Я тоже столкнулся с этой проблемой, и, наконец, мы выяснили причину сбоя на Android 8.0 и Android 8.1.
первая причина (важная подсказка): пустая подсказка (android: hint = "") в xml приводит к сбою в устройстве oreo. Удалите эту пустую подсказку в editText при поиске по всему проекту.
Вторая причина (такая же, как объяснение выше): убедитесь, что ваша подсказка editText должна отображаться внутри TextInputLayout, если вы использовали TextInputLayout, иначе вы можете использовать подсказку внутри editText.
Надеюсь, это поможет вам !!
Спасибо
источник