Подтвердить что ты не робот

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 на устройствах?

4b9b3361

Ответ 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>