Android 8.0 Oreo ขัดข้องในการโฟกัส TextInputEditText


101

หลังจากอัปเดตอุปกรณ์บางอย่างของเราเป็น Android 8.0 เมื่อโฟกัสไปที่TextInputEditTextฟิลด์ภายใน a 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 ()

นั่นทำให้ผมลองตั้งค่าคำแนะนำบนแทนการซ้อนกันTextInputLayoutEditText

วิธีนี้ช่วยแก้ปัญหาการขัดข้องให้ฉันได้ ตัวอย่าง:

<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 โซลูชันนี้ไม่คงพฤติกรรม ในกรณีของฉันฉันใช้มันสำหรับภาพเคลื่อนไหวฉลากลอย เมื่อฉันใช้วิธีนี้คำใบ้ / ป้ายกำกับจะไม่ปรากฏขึ้น ทั้งหมดที่ฉันเห็นคือ
textinput

@KrishnaCA ที่ค่อนข้างแปลก ฉันใช้วิธีนี้ทุกที่ในแอพของฉันและทั้งสองแสดงคำใบ้ในข้อความแก้ไขและทำให้เคลื่อนไหวเป็นป้ายกำกับลอย ฉันไม่แน่ใจว่าอะไรเป็นสาเหตุของปัญหาของคุณ คุณสามารถโพสต์ตัวอย่างโค้ดของรูปแบบ xml ของคุณในคำถามและเชื่อมโยงฉันไป เรายินดีที่จะพยายามช่วยเหลือ
Azethoth

เหมือนกับที่โพสต์ไว้ในคำตอบของคุณ อุปกรณ์ที่ฉันทดสอบคือ Huawei
KrishnaCA

25

เพิ่มแอตทริบิวต์ที่กล่าวถึงด้านล่างในEditText:

android:importantForAutofill="noExcludeDescendants"


ฟีเจอร์นี้ใช้สำหรับ API 26 เท่านั้นมีวิธีแก้ไขไหมหาก min API ของคุณน้อยกว่า 26?
JPM

2
@JPM ไม่ต้องกังวลมันจะถูกละเว้นในระดับ API ที่เก่ากว่าดังนั้นจะไม่ผิดพลาดหรือเป็นปัญหา
Pei

2
ปัญหา @JPM อยู่ใน Oreo เท่านั้นดังนั้นจะถูกละเว้นสำหรับ API รุ่นเก่าและจะไม่เกิดข้อผิดพลาดสำหรับพวกเขา
Gaurav Singh

ฉันมีใน 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>

ด้วยวิธีนี้คุณจะทำการเปลี่ยนแปลงนี้สำหรับEditTexts ทั้งหมดของคุณโดยไม่จำเป็นต้องเปลี่ยนไฟล์เลย์เอาต์ของคุณ


1
จะบันทึกข้อกำหนด min API จะต้องวางในโฟลเดอร์ทรัพยากร v26
StarWind0

6

คุณสามารถตั้งค่าใด ๆ สำหรับimportantForAutofillด้วยสไตล์หรือใน 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

@ ลุคซิมป์สันพูดถูก คุณสามารถใช้ใน themes.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 ในโฟลเดอร์เริ่มต้น มิฉะนั้นคุณสมบัติทั้งหมดของข้อความแก้ไขจะถูกแทนที่ด้วยสิ่งนี้และข้อความแก้ไขของฉันทำงานไม่ถูกต้อง และเมื่อคุณใส่คุณสมบัติ importantForAutoFill สำหรับ 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

หากใครยังต้องการ " hint " ใน " TextInputEditText " make app: 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

หวังว่านี่จะช่วยคุณได้ !!

ขอบคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.