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 на устройствах?
Ответы
Ответ 1
Я столкнулся с этим тоже. Оказывается, проблема была вызвана настройкой текста подсказки для EditText
, вложенного в TextInputLayout
.
Я немного покопался и нашел этот самородок в примечаниях к выпуску Beta 2 26.0.0.
Примечания к выпуску поддержки 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>
Я разместил это как ответ здесь, поскольку перепутал закладки. Извините за публикацию одного и того же ответа дважды.
Ответ 2
Добавьте нижеуказанный атрибут в свой EditText
:
android:importantForAutofill="noExcludeDescendants"
Ответ 3
Люк Симпсон почти прав, просто нужно использовать "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, не изменяя файлы макета.
Ответ 4
Я использовал v26/themes.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>
Ответ 5
Вы можете установить любое значение importantForAutofill со стилем или в XML, которое оно исправляет для NPE, когда вы фокусируете EditText, но это не исправьте, если вы долго нажимаете EditText и вы нажимаете AutoFill. Я нашел сообщение об ошибке об этой ошибке здесь, добавьте звезду и поделитесь своими наблюдениями в отчете об ошибке.
спасибо.
Ответ 6
@Люк Симпсон прав. Вы можете использовать его в 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 в папку по умолчанию. В противном случае все свойства текста редактирования были переопределены этим, и мой текст редактирования не работал должным образом.
И когда вы устанавливаете свойство важныйForAutoFill для 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.
Ответ 7
Если кто-то все еще хочет подсказку"в"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>