Sự cố Android 8.0 Oreo khi lấy nét TextInputEditText


100

Sau khi cập nhật một số thiết bị của chúng tôi lên android 8.0, khi tập trung vào một TextInputEditTexttrường bên trong a TextInputLayout, ứng dụng gặp sự cố 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)

Khi chúng tôi đi tới Cài đặt android -> Hệ thống -> Ngôn ngữ & đầu vào -> Nâng cao -> Dịch vụ tự động điền -> Không có , sau đó tập trung vào TextInputEditText / TextInputLayoutkhông còn bị treo.

Làm cách nào chúng ta có thể ngăn sự cố xảy ra mà không phải tắt dịch vụ Tự động điền 8.0 mới trên thiết bị?


Câu trả lời:


186

Tôi cũng gặp phải vấn đề này. Hóa ra vấn đề là do đặt văn bản gợi ý vào EditTextlồng trong TextInputLayout.

Tôi đã đào một số và tìm thấy hạt nhân này trong ghi chú phát hành 26.0.0 Beta 2. Ghi chú phát hành hỗ trợ Android tháng 6 năm 2017

TextInputLayout phải đặt gợi ý trên onProvideAutofillStructure ()

Điều đó đã khiến tôi thử đặt gợi ý TextInputLayoutthay vì lồng vào EditText.

Điều này đã giải quyết sự cố cho tôi. Thí dụ:

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

Tôi đã đăng điều này như một câu trả lời ở đây khi tôi trộn các dấu trang. Xin lỗi vì đã đăng cùng một câu trả lời hai lần.


Điều này sẽ hoạt động nếu không có android.support.design:hintAnimationEnabled và android.support.design:hintEnabled? Tôi đã xem nguồn TextInputLayout, cả hai thuộc tính dường như được đặt làm mặc định khi tải thuộc tính.
androidguy 21/07/18

@androidguy vâng, nó sẽ hoạt động mà không có các thuộc tính đó. Những thuộc tính kể TextInputLayout phân bổ không gian trong bố trí cho những mặt hàng (hoặc ít nhất đó là những gì tôi đã quan sát)
Azethoth

@Azethoth Giải pháp này không giữ lại hành vi. Trong trường hợp của tôi, tôi đang sử dụng nó cho hoạt ảnh nhãn nổi. Khi tôi sử dụng nó theo cách này, gợi ý / nhãn không xuất hiện. Tất cả những gì tôi có thể thấy là một thông lượng tin nhắn
KrishnaCA

@KrishnaCA điều đó khá kỳ lạ. Tôi sử dụng cách tiếp cận này ở mọi nơi trong ứng dụng của mình và nó vừa hiển thị gợi ý trong văn bản chỉnh sửa vừa làm hoạt ảnh nó dưới dạng nhãn nổi. Tôi không chắc điều gì có thể gây ra sự cố của bạn. Bạn có thể đăng một mẫu mã về bố cục xml của bạn trong một câu hỏi và liên kết tôi với nó không? Tôi rất vui được thử và hỗ trợ.
Azethoth

Nó giống như được đăng trong câu trả lời của bạn. Các thiết bị mà tôi thử nghiệm là Huawei
KrishnaCA

25

Thêm thuộc tính được đề cập bên dưới trong EditText:

android:importantForAutofill="noExcludeDescendants"


Tính năng chỉ dành cho API 26. Có giải pháp nào nếu API tối thiểu của bạn nhỏ hơn 26 không?
JPM

2
@JPM Đừng lo lắng, nó chỉ bị bỏ qua trong các cấp API cũ hơn nên sẽ không gặp sự cố hay sự cố.
Pei

2
Vấn đề @JPM chỉ có trên Oreo, vì vậy nó sẽ bị bỏ qua đối với các API cũ hơn và sẽ không gặp sự cố đối với chúng.
Gaurav Singh

Tôi có nó trong PROD bây giờ trên ứng dụng của tôi dường như đang hoạt động tốt
JPM

1
Đây là giải pháp không chính xác. Nó bị treo khi bạn nhấn và giữ EditText và chọn Tự động điền từ menu. Giải pháp đúng (mặc dù yêu cầu mã): stackoverflow.com/a/46698028/1714102
Przemo

11

Luke Simpson gần như đã làm đúng, chỉ nên sử dụng "styles.xml" thay vì "themes.xml".

Tôi đã tạo một tệp kiểu mới với bộ định nghĩa phiên bản, nhắm đến v26, để làm rõ ràng hơn.
Chỉ cần sao chép và dán của bạn AppThemecho v26 / styles.xml và thêm editTextStylecác mục EditTextStyletheo phong cách.

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

Bằng cách này, bạn thực hiện các thay đổi này cho tất cả các EditTexts của mình mà không cần thay đổi các tệp bố cục của bạn.


1
Sẽ lưu ý yêu cầu API tối thiểu, sẽ cần đặt trong thư mục tài nguyên v26.
StarWind0

6

Bạn có thể đặt bất kỳ giá trị nào cho importantForAutofill bằng một kiểu hoặc trong XML, nó sẽ sửa lỗi cho NPE khi bạn đặt tiêu điểm EditText nhưng nó không được sửa nếu bạn nhấn và giữ EditText và bạn nhấp vào AutoFill. Tôi đã tìm thấy Báo cáo lỗi về lỗi này ở đây , vui lòng thêm dấu sao và chia sẻ quan sát của bạn trong báo cáo lỗi này.

Cám ơn.


5

Tôi đã sử dụng v26 / themes.xml để ghi đè tự động điền kiểu EditText chỉ dành cho Oreo 8.0.0:

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

Lưu ý rằng tôi phải áp dụng kiểu nội tuyến cho mỗi EditText trong xml bố cục của mình để nó có hiệu lực. Tôi đã cố gắng áp dụng thay đổi này trên toàn cầu trong chủ đề ứng dụng của mình nhưng vì lý do nào đó nó không hoạt động.

// 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 nói đúng. Bạn có thể sử dụng nó trong các theme.XML như: -

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

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

trong V26 / app_styles.xml

Tuy nhiên, tôi cũng phải đặt thẻ trống trong app_styles.xml trong thư mục mặc định. Nếu không, tất cả các thuộc tính của Chỉnh sửa văn bản đang bị ghi đè bởi điều này và văn bản chỉnh sửa của tôi không hoạt động bình thường. Và khi bạn đặt thuộc tính importantForAutoFill cho v26 và bạn muốn tính năng tự động điền hoạt động trong 8.1, bạn chỉ cần đặt

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

Vì vậy, thuộc tính tự động điền hoạt động trong 8.1. Nó sẽ bị vô hiệu hóa chỉ cho 8.0 vì sự cố đang xảy ra ở 8.0 và nó đã được khắc phục trong 8.1.


0

Nếu ai đó vẫn muốn " gợi ý " trong " TextInputEditText ", hãy làm ứng dụng: hintEnabled = "false" trong 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

Tôi cũng đã đối mặt với vấn đề này và cuối cùng chúng tôi đã tìm ra lý do lỗi trên Android 8.0 và Android 8.1.

lý do đầu tiên (manh mối quan trọng): gợi ý trống (android: hint = "") trong xml dẫn đến sự cố trong thiết bị oreo. Vui lòng xóa gợi ý trống này trong editText trong toàn bộ dự án tìm kiếm.

lý do thứ hai (giống như giải thích ở trên): đảm bảo gợi ý editText của bạn phải được hiển thị bên trong TextInputLayout nếu bạn đã sử dụng TextInputLayout, nếu không bạn có thể sử dụng gợi ý bên trong editText.

Hy vọng điều này giúp bạn !!

Cảm ơn bạn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.