Po zaktualizowaniu niektórych naszych urządzeń do systemu Android 8.0, po skupieniu się na TextInputEditText
polu wewnątrz a TextInputLayout
, aplikacja zawiesza się z tym 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)
Kiedy przechodzimy do Ustawienia Androida -> System -> Języki i wprowadzanie -> Zaawansowane -> Usługa autouzupełniania -> Brak , a następnie skupiając się na TextInputEditText
/
TextInputLayout
już nie ulega awarii.
Jak możemy zapobiec wystąpieniu awarii bez konieczności wyłączania nowej usługi automatycznego wypełniania 8.0 na urządzeniach?
android
android-edittext
android-8.0-oreo
android-textinputlayout
jesobremonte
źródło
źródło
Odpowiedzi:
Ja też na to wpadłem. Okazuje się, że problem był spowodowany ustawieniem tekstu podpowiedzi w
EditText
zagnieżdżonym plikuTextInputLayout
.Poszperałem trochę i znalazłem ten samorodek w informacjach o wydaniu 26.0.0 Beta 2. Informacje o wersji obsługi Androida, czerwiec 2017 r
To skłoniło mnie do próby ustawienia podpowiedzi
TextInputLayout
zamiast zagnieżdżeniaEditText
.To rozwiązało problem z awariami. Przykład:
Opublikowałem to jako odpowiedź tutaj, gdy pomieszałem zakładki. Przepraszamy za dwukrotne opublikowanie tej samej odpowiedzi.
źródło
Dodaj poniższy atrybut w swoim
EditText
:android:importantForAutofill="noExcludeDescendants"
źródło
Luke Simpson prawie to zrobił, powinien po prostu użyć „styles.xml” zamiast „themes.xml”.
Stworzyłem nowy plik stylu z kwalifikatorem wersji, mając na celu v26, aby był bardziej przejrzysty.
Po prostu skopiuj i wklej swój
AppTheme
do v26 / styles.xml i dodajeditTextStyle
elementy doEditTextStyle
stylu.W ten sposób wprowadzasz te zmiany dla wszystkich swoich EditTextów bez konieczności zmiany plików układu.
źródło
Możesz ustawić dowolną wartość dla importantForAutofill za pomocą stylu lub w kodzie XML, który jest poprawiony dla NPE, gdy skupisz się na EditText, ale nie zostanie to naprawione, jeśli długo naciśniesz EditText i klikniesz Autouzupełnianie. Znalazłem zgłoszenia o tego błędu tutaj , proszę dodać gwiazdkę i wymieniać się spostrzeżeniami w raporcie bug również.
Dzięki.
źródło
Użyłem v26 / themes.xml, aby zastąpić autouzupełnianie stylu EditText tylko dla Oreo 8.0.0:
Zauważ, że musiałem zastosować styl w tekście dla każdego EditText w moim układzie XML, aby odniosło skutek. Próbowałem zastosować tę zmianę globalnie w motywie mojej aplikacji, ale z jakiegoś powodu nie zadziałało.
źródło
@Luke Simpson ma rację. Możesz go używać w plikachmes.XML, takich jak: -
w wersji 26 / app_styles.xml
Ale musiałem umieścić pusty tag również w app_styles.xml w domyślnym folderze. W przeciwnym razie wszystkie właściwości tekstu edycji były zastępowane przez to, a mój tekst edycji nie działał poprawnie. A kiedy umieścisz właściwość importantForAutoFill dla wersji 26 i chcesz, aby autouzupełnianie działało w wersji 8.1, możesz po prostu wstawić
Tak więc właściwość autouzupełniania działa w wersji 8.1. Zostanie wyłączony tylko w wersji 8.0, ponieważ awaria ma miejsce w 8.0 i została już naprawiona w 8.1.
źródło
Jeśli ktoś nadal chce „ podpowiedź ” w „ TextInputEditText ”, utwórz aplikację: hintEnabled = „false” w TextInputLayout
źródło
Miałem również do czynienia z tym problemem i wreszcie mamy przyczynę awarii na Androidzie 8.0 i Androidzie 8.1.
pierwszy powód (ważna wskazówka): pusta wskazówka (android: hint = "") w xml prowadzi do awarii na urządzeniu oreo. Usuń tę pustą wskazówkę z editText podczas wyszukiwania całego projektu.
Drugi powód (taki sam, jak wyjaśniono powyżej): upewnij się, że twoja wskazówka editText powinna być pokazana w TextInputLayout, jeśli użyłeś TextInputLayout, w przeciwnym razie możesz użyć wskazówki w editText.
Mam nadzieję, że to ci pomoże !!
Dziękuję Ci
źródło