Android 8.0 Oreo mengalami error saat memfokuskan TextInputEditText

101

Setelah memperbarui beberapa perangkat kami ke Android 8.0, setelah berfokus pada TextInputEditTextbidang di dalam a TextInputLayout, aplikasi mogok dengan ini 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)

Ketika kita pergi ke Android Settings -> System -> Languages ​​& input -> Advanced -> Auto-fill service -> None , lalu fokus pada TextInputEditText / TextInputLayouttidak lagi crash.

Bagaimana kita dapat mencegah terjadinya crash tanpa harus menonaktifkan layanan baru 8.0 Isi-Otomatis pada perangkat?

jesobremonte
sumber

Jawaban:

187

Aku juga mengalami ini. Ternyata masalah itu disebabkan oleh pengaturan teks petunjuk di EditTextdalam file TextInputLayout.

Saya melakukan penggalian dan menemukan nugget ini di catatan rilis 26.0.0 Beta 2. Catatan Rilis Dukungan Android Juni 2017

TextInputLayout harus menyetel petunjuk pada onProvideAutofillStructure ()

Itu membuat saya mencoba mengatur petunjuk di TextInputLayoutalih - alih bersarang EditText.

Ini menyelesaikan masalah mogok untuk saya. Contoh:

<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>

Saya memposting ini sebagai jawaban di sini karena saya mencampuradukkan bookmark. Maaf telah memposting jawaban yang sama dua kali.

Azethoth
sumber
Apakah ini akan berfungsi tanpa android.support.design:hintAnimationEnabled dan android.support.design:hintEnabled? Saya melihat sumber TextInputLayout, kedua atribut tampaknya disetel sebagai default saat memuat atribut.
androidguy
@androidguy ya seharusnya berfungsi tanpa atribut tersebut. Atribut tersebut memberi tahu TextInputLayout untuk mengalokasikan ruang dalam tata letak untuk item tersebut (atau setidaknya itulah yang telah saya amati)
Azethoth
@Azethoth Solusi ini tidak mempertahankan perilaku. Dalam kasus saya, saya menggunakannya untuk animasi label mengambang. Ketika saya menggunakannya dengan cara ini, petunjuk / label tidak muncul. Yang bisa saya lihat hanyalah input teks
KrishnaCA
@KrishnaCA itu cukup aneh. Saya menggunakan pendekatan ini di mana-mana di aplikasi saya dan keduanya menunjukkan petunjuk dalam teks edit dan menganimasinya sebagai label mengambang. Saya tidak yakin apa yang mungkin menyebabkan masalah Anda. Dapatkah Anda memposting contoh kode tata letak xml Anda dalam sebuah pertanyaan dan menautkan saya ke sana? Saya akan dengan senang hati mencoba dan membantu.
Azethoth
Ini sama seperti yang diposting di jawaban Anda. Perangkat yang saya uji adalah Huawei
KrishnaCA
25

Tambahkan atribut yang disebutkan di bawah ini di EditText:

android:importantForAutofill="noExcludeDescendants"

Gaurav Singh
sumber
Fitur hanya untuk API 26 apakah ada solusi jika min API Anda kurang dari 26?
JPM
2
@JPM Jangan khawatir, ini hanya diabaikan di level API yang lebih lama jadi tidak akan crash atau menjadi masalah.
Pei
2
Masalah @JPM hanya ada di Oreo, jadi itu akan diabaikan untuk API yang lebih lama dan tidak akan mogok untuk mereka.
Gaurav Singh
Saya memilikinya di PROD sekarang di aplikasi saya tampaknya berfungsi dengan baik
JPM
1
Ini adalah solusi yang salah. Itu macet ketika Anda menekan lama pada EditText dan memilih IsiOtomatis dari menu. Solusi yang benar (meskipun memerlukan kode): stackoverflow.com/a/46698028/1714102
Przemo
11

Luke Simpson hampir memperbaikinya, sebaiknya gunakan "styles.xml" bukan "themes.xml".

Saya membuat file gaya baru dengan pengualifikasi versi, dengan tujuan v26, untuk membuatnya lebih jelas.
Cukup salin dan tempel Anda AppThemeuntuk v26 / styles.xml dan tambahkan editTextStyleitem EditTextStylegayanya.

<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>

Dengan cara ini Anda membuat perubahan ini untuk semua EditText Anda tanpa perlu mengubah file layout Anda.

Endy Silveira
sumber
1
Akan mencatat persyaratan API min, yang perlu ditempatkan di folder sumber daya v26.
StarWind0
6

Anda dapat mengatur nilai apa pun untuk importantForAutofill dengan gaya atau dalam XML, ini memperbaiki NPE saat Anda memfokuskan EditText tetapi tidak diperbaiki jika Anda menekan lama EditText dan Anda mengklik IsiOtomatis. Saya menemukan Laporan Bug tentang bug ini di sini , harap tambahkan bintang dan bagikan juga pengamatan Anda di laporan bug.

Terima kasih.

Nicolas Van Damme
sumber
5

Saya menggunakan v26 / themes.xml untuk mengganti autofill gaya EditText hanya untuk Oreo 8.0.0:

<style name="EditTextStyle" parent="Widget.AppCompat.EditText">
    <item name="android:importantForAutofill">noExcludeDescendants</item>
</style>

Perhatikan bahwa saya harus menerapkan gaya sebaris untuk setiap EditText di tata letak xml saya agar dapat diterapkan. Saya mencoba menerapkan perubahan ini secara global di tema aplikasi saya tetapi tidak berhasil karena beberapa alasan.

// 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>
Luke Simpson
sumber
0

@ Luke Simpson benar. Anda dapat menggunakannya di themes.XML seperti: -

<item name="editTextStyle">@style/AppEditTextStyle</item>

and then put
<style name="AppEditTextStyle" parent="Widget.AppCompat.EditText">
        <item name="android:importantForAutofill">auto</item>
 </style>

di V26 / app_styles.xml

Tapi, saya juga harus meletakkan tag kosong di app_styles.xml di folder default. Jika tidak, semua properti Edit teks ditimpa oleh ini dan teks edit saya tidak berfungsi dengan benar. Dan saat Anda meletakkan properti importantForAutoFill untuk v26 dan ingin IsiOtomatis berfungsi di 8.1, Anda cukup meletakkan

<style name="AppEditTextStyle" parent="Widget.AppCompat.EditText">
        <item name="android:importantForAutofill">auto</item>
    </style>

Jadi, properti IsiOtomatis berfungsi di 8.1. Ini akan dinonaktifkan hanya untuk 8.0 karena crash terjadi di 8.0 dan sudah diperbaiki di 8.1.

Monika Saini
sumber
0

Jika ada yang masih menginginkan " petunjuk " di " TextInputEditText " buat aplikasi: hintEnabled = "false" di 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>
Prakash Bala
sumber
0

Saya juga menghadapi masalah ini dan akhirnya kami mendapat alasan crash di android 8.0 dan android 8.1.

alasan pertama (petunjuk penting): petunjuk kosong (android: hint = "") di xml menyebabkan crash di perangkat oreo. Harap hapus petunjuk kosong ini di editText di seluruh penelusuran proyek.

alasan kedua (sama seperti penjelasan di atas): pastikan petunjuk editText Anda harus ditampilkan di dalam TextInputLayout jika Anda telah menggunakan TextInputLayout jika tidak, Anda dapat menggunakan petunjuk di dalam editText.

Semoga ini membantu Anda !!

Terima kasih

CHANDAN KUMAR
sumber