TextInputEditText'e odaklanmada Android 8.0 Oreo çökmesi


101

Cihazlarımızdan bazılarını android 8.0 sürümüne güncelledikten sonra, a TextInputEditTextiçindeki bir alana odaklanıldığında TextInputLayout, uygulama şununla çöküyor 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 Ayarlar -> Sistem -> Diller ve giriş -> Gelişmiş -> Otomatik doldurma servisi -> Yok'a gittiğimizde , TextInputEditText / TextInputLayoutartık çökmelere odaklanıyoruz .

Cihazlarda yeni 8.0 Otomatik Doldurma hizmetini devre dışı bırakmak zorunda kalmadan çökmenin olmasını nasıl önleyebiliriz?


Yanıtlar:


187

Ben de bununla karşılaştım. Bu konu ile ilgili ipucu metnini ayarlayarak neden oldu çıkıyor EditTextiçeride iç içe TextInputLayout.

Biraz araştırma yaptım ve bu külçeyi 26.0.0 Beta 2 sürüm notlarında buldum. Android Desteği Sürüm Notları Haziran 2017

TextInputLayout, onProvideAutofillStructure () için ipuçları ayarlamalıdır

Bu, ipucunu TextInputLayoutyuvalanmış yerine üzerine yerleştirmeyi denememe yol açtı EditText.

Bu benim için çökme sorununu çözdü. Misal:

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

Yer imlerini karıştırırken bunu cevap olarak buraya gönderdim . Aynı cevabı iki kez gönderdiğim için özür dilerim.


Bu, android.support.design:hintAnimationEnabled ve android.support.design:hintEnabled olmadan çalışır mı? TextInputLayout kaynağına baktım, öznitelikler yüklenirken her iki öznitelik de varsayılan olarak ayarlanmış görünüyor.
androidguy

@androidguy evet bu öznitelikler olmadan çalışmalı. Bu öznitelikler TextInputLayout'a bu öğeler için mizanpajda yer
ayırmasını söyler

@Azethoth Bu çözüm davranışı korumaz. Benim durumumda, onu kayan etiket animasyonu için kullanıyorum. Bu şekilde kullandığımda ipucu / etiket görünmüyor. Tek görebildiğim bir metin girdisi
KrishnaCA

@KrishnaCA bu oldukça tuhaf. Bu yaklaşımı uygulamamın her yerinde kullanıyorum ve hem düzenleme metnindeki ipucunu gösteriyor hem de onu hareketli bir etiket olarak canlandırıyor. Sorununuza neyin neden olduğundan emin değilim. Bir soruya xml düzeninizin bir kod örneğini gönderebilir ve beni buna bağlayabilir misiniz? Denemekten ve yardım etmekten mutluluk duyarım.
Azethoth

Cevabınızda yayınlananla aynı. Test ettiğim cihaz Huawei
KrishnaCA

25

Aşağıda belirtilen özelliği ekleyin EditText:

android:importantForAutofill="noExcludeDescendants"


Özellik yalnızca API 26 içindir. Min API'niz 26'dan küçükse bir çözüm var mı?
JPM

2
@JPM Endişelenmeyin, sadece eski API seviyelerinde göz ardı edilir, bu yüzden çökmez veya bir sorun oluşturmaz.
Pei

2
@JPM sorunu yalnızca Oreo'da olduğu için eski API'ler için göz ardı edilecek ve onlar için çökmeyecek.
Gaurav Singh

PROD'da şimdi uygulamamda gayet iyi çalışıyor gibi görünüyor
JPM

1
Bu yanlış çözüm. EditText'e uzun bastığınızda ve menüden Otomatik Doldur'u seçtiğinizde çöküyor. Doğru (kod gerektirmesine rağmen) çözüm: stackoverflow.com/a/46698028/1714102
Przemo

11

Luke Simpson neredeyse doğru yapıyor, sadece "temalar.xml" yerine "styles.xml" kullanmalı.

Daha net hale getirmek için v26'yı hedefleyen sürüm niteleyicili yeni bir stil dosyası oluşturdum. V26 / styles.xml için
dosyanızı kopyalayıp yapıştırın ve stile öğeler AppThemeekleyin .editTextStyleEditTextStyle

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

Bu şekilde , düzen dosyalarınızı değiştirmenize gerek kalmadan tüm EditTexts dosyalarınız için bu değişiklikleri yaparsınız.


1
Minimum API gereksinimini not edecek, v26 kaynak klasörüne yerleştirilmesi gerekecek.
StarWind0

6

Bir stille veya XML'de , önemli için otomatik doldurma için herhangi bir değer ayarlayabilirsiniz , bu, EditText'e odaklandığınızda NPE için düzeltilmiştir, ancak EditText'e uzun süre basarsanız ve Otomatik Doldur'a tıklarsanız bu düzeltilmez. Burada bu hata hakkında bir Hata Raporu buldum , lütfen bir yıldız ekleyin ve gözlemlerinizi hata raporunda da paylaşın.

Teşekkürler.


5

Yalnızca Oreo 8.0.0 için EditText stili otomatik doldurmayı geçersiz kılmak için v26 / themes.xml'yi kullandım:

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

Etkili olması için düzen xml'imdeki her EditText için stili satır içi uygulamam gerektiğini unutmayın. Bu değişikliği uygulama temamda global olarak uygulamaya çalıştım ancak nedense işe yaramadı.

// 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 haklı. Temalarda kullanabilirsiniz.XML gibi: -

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

Ancak, varsayılan klasördeki app_styles.xml dosyasında da boş bir etiket koymak zorunda kaldım. Aksi takdirde, Metni Düzenle'nin tüm özellikleri bununla geçersiz hale geliyordu ve düzenleme metnim düzgün çalışmıyordu. Ve v26 için importantForAutoFill özelliğini koyduğunuzda ve otomatik doldurmanın 8.1'de çalışmasını istediğinizde,

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

Dolayısıyla, otomatik doldurma özelliği 8.1'de çalışır. Sadece 8.0 için devre dışı bırakılacak çünkü çarpışma 8.0'de gerçekleşiyor ve 8.1'de düzeltildi.


0

Herkes hala "isterse ipucu " in " TextInputEditText " markası hintEnabled = "false": app içinde 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

Ben de bu sorunla karşı karşıya kaldım ve sonunda android 8.0 ve android 8.1'de çökme nedenini aldık.

ilk neden (önemli ipucu): xml'deki boş ipucu (android: hint = "") oreo cihazında çökmeye neden olur. Lütfen tüm proje aramasında editText'teki bu boş ipucunu kaldırın.

ikinci neden (yukarıdaki açıklamayla aynı): TextInputLayout kullandıysanız, editText ipucunuzun TextInputLayout içinde gösterildiğinden emin olun, aksi takdirde editText içinde ipucu kullanabilirsiniz.

Umarım bu size yardımcı olur !!

teşekkür ederim

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.