Android 8.0 Oreo аварія на фокусуванні TextInputEditText


101

Після оновлення деяких наших пристроїв до андроїд 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 на пристроях?


Відповіді:


187

Я теж наткнувся на це. Виявляється, проблема була викликана встановленням тексту підказки на 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>

Я розмістив це як відповідь тут, коли я змішував закладки. Вибачте, що опублікували одну і ту ж відповідь двічі.


Чи буде це працювати без android.support.design:hintAnimationEnabled та android.support.design:hintEnabled? Я переглянув джерело TextInputLayout, але, здається, обидва атрибути встановлені за замовчуванням при завантаженні атрибутів.
androidguy

@androidguy так, він повинен працювати без цих атрибутів. Ці атрибути говорять TextInputLayout виділити простір у макеті для цих елементів (або, принаймні, це те, що я спостерігав)
Azethoth

@Azethoth Це рішення не зберігає поведінку. У моєму випадку я використовую його для анімації з плаваючою міткою. Коли я використовую це таким чином, підказка / мітка не відображається. Все, що я можу побачити - це
введення тексту

@KrishnaCA це досить дивно. Я використовую такий підхід скрізь у своїй програмі, і він відображає підказку в тексті редагування та оживляє його як плаваючу мітку. Я не впевнений, що може спричинити вашу проблему. Чи можете ви опублікувати зразок коду вашого формату XML у запитанні та зв’язати мене з ним? Я б радий спробувати і допомогти.
Азетот

Це те саме, що розміщено у вашій відповіді. Пристрій, на який я тестував, - Huawei
KrishnaCA

25

Додайте нижче згаданий атрибут у своєму EditText:

android:importantForAutofill="noExcludeDescendants"


Функція лише для API 26 Чи є рішення, якщо ваш min API менше 26?
JPM

2
@JPM Не хвилюйтесь, він просто ігнорується на старих рівнях API, тому не вийде з ладу і не стане проблемою.
Пей

2
Проблема @JPM працює лише в Oreo, тому для старих API вони не будуть ігноруватися і не матимуть збоїв.
Гаурав Сінгх

Я маю це в PROD зараз на моєму додатку, здається, працює просто чудово
JPM

1
Це неправильне рішення. Він виходить з ладу, коли ви довго натискаєте на EditText і вибираєте в меню Автозаповнення. Правильний (хоча вимагає код) рішення: stackoverflow.com/a/46698028/1714102
Przemo

11

Люк Сімпсон майже зробив це правильно, просто слід використовувати "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>

Таким чином ви вносите ці зміни для всіх своїх редакційних файлів без зміни файлів компонування.


1
Зазначимо вимогу min API, потрібно буде розмістити в папці ресурсів v26.
StarWind0

6

Ви можете встановити будь-яке значення для важливогоForAutofill зі стилем або в XML це виправити для NPE, коли ви фокусуєте EditText, але це не виправити, якщо довго натиснути EditText і натиснути на Автозаповнення. Я знайшов помилку Повідомити про цю помилку тут , будь ласка , додайте зірку і поділитися своїми спостереженнями в повідомленні про помилку також.

Дякую.


5

Я використовував 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>

0

@Luke Simpson має рацію. Ви можете використовувати його в таких темах.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.


0

Якщо хтось все ще хоче " підказку " в " TextInputEditText ", зробіть додаток: 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>

0

Я також зіткнувся з цим питанням, і нарешті ми з’ясували причину аварій на Android 8.0 і Android 8.1.

Перша причина (важлива підказка): порожній підказки (android: hint = "") у xml призводить до збоїв у пристрої oreo. Видаліть цей порожній підказку у editText під час пошуку всього проекту.

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

Сподіваюся, що це допоможе вам !!

Дякую

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.