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 71

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.