TextInputEditText को फोकस करने पर Android 8.0 Oreo क्रैश


101

एंड्रॉइड 8.0 पर हमारे कुछ उपकरणों को अपडेट करने के बाद, एक के TextInputEditTextअंदर एक क्षेत्र पर ध्यान केंद्रित करने पर 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)

जब हम एंड्रॉइड सेटिंग्स पर जाते हैं -> सिस्टम -> भाषाएं और इनपुट -> उन्नत -> ऑटो-फिल सेवा -> कोई नहीं , तो TextInputEditText / TextInputLayoutअब क्रैश नहीं होने पर ध्यान केंद्रित करना ।

हम उपकरणों पर नई 8.0 ऑटो-फिल सेवा को अक्षम किए बिना दुर्घटना को कैसे रोक सकते हैं?


जवाबों:


187

मैं इसमें भी भागा। यह पता चला कि मुद्दा EditTextअंदर के घोंसले पर संकेत पाठ को सेट करने के कारण हुआ था TextInputLayout

मैंने कुछ खुदाई की और 26.0.0 बीटा 2 के रिलीज नोटों में यह डला मिला। एंड्रॉइड सपोर्ट रिलीज़ नोट्स जून 2017

TextInputLayout को onProvideAutofillStructure () पर संकेत सेट करने होंगे

जिसके कारण मुझे TextInputLayoutनेस्टेड के बजाय संकेत सेट करने का प्रयास करने की अनुमति मिली EditText

इसने मेरे लिए दुर्घटनाग्रस्त मुद्दे को हल कर दिया। उदाहरण:

<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 लेआउट का कोड नमूना पोस्ट कर सकते हैं और मुझे उससे लिंक कर सकते हैं? मुझे कोशिश करने और सहायता करने में खुशी होगी।
अजेथोथ

यह आपके उत्तर में पोस्ट के समान है। डिवाइस है कि मैं के लिए परीक्षण किया है Huawei
कृष्णा

25

नीचे उल्लिखित विशेषता को अपने में जोड़ें EditText:

android:importantForAutofill="noExcludeDescendants"


सुविधा केवल एपीआई 26 के लिए है क्या कोई समाधान है यदि आपकी न्यूनतम एपीआई 26 से कम है?
JPM

2
@JPM कोई चिंता नहीं है, यह सिर्फ पुराने एपीआई स्तरों में नजरअंदाज कर दिया गया है इसलिए दुर्घटना नहीं होगी या एक मुद्दा नहीं होगा।
पेई

2
@JPM का मुद्दा केवल ओरियो पर है, इसलिए यह पुराने APIs के लिए अनदेखा हो जाएगा और उनके लिए क्रैश नहीं होगा।
गौरव सिंह

मुझे लगता है कि मेरे ऐप पर अभी PROD में है, ठीक
JPM

1
यह गलत समाधान है। जब आप EditText पर लंबे समय तक प्रेस करते हैं और मेनू से ऑटोफिल चुनते हैं तो यह क्रैश हो जाता है। सही (हालाँकि कोड की आवश्यकता होती है) समाधान: stackoverflow.com/a/46698028/1714102
प्रज़ेमो

11

ल्यूक सिम्पसन लगभग इसे सही बनाते हैं, बस "themes.xml" के बजाय "स्टाइल.एक्सएमएल" का उपयोग करना चाहिए।

मैंने संस्करण क्वालीफ़ायर के साथ एक नई शैली फ़ाइल बनाई, जिसका लक्ष्य v26 है, इसे स्पष्ट करने के लिए।
बस AppThemev26 / style.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
मिन एपीआई की आवश्यकता पर ध्यान देगा, इसे v26 संसाधन फ़ोल्डर में रखना होगा।
StarWind0

6

आप एक शैली के साथ महत्वपूर्ण XML में कोई भी मान सेट कर सकते हैं या XML में इसे NPE के लिए ठीक कर सकते हैं जब आप EditText पर ध्यान केंद्रित करते हैं, लेकिन यह ठीक नहीं होता है अगर आपका लंबे समय तक EditText दबाएँ और आप AutoFill पर क्लिक करें। मैं इस बग के बारे में बग रिपोर्ट पाया यहाँ , भी बग रिपोर्ट में एक सितारा जोड़ सकते हैं और अपनी टिप्पणियों साझा करें।

धन्यवाद।


5

मैंने केवल Oreo 8.0.0 के लिए EditText स्टाइल ऑटोफिल को ओवरराइड करने के लिए v26 / themes.xml का उपयोग किया:

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

ध्यान दें कि मुझे प्रभावी होने के लिए अपने लेआउट xml में प्रत्येक EditText के लिए स्टाइल इनलाइन लागू करना था। मैंने अपने ऐप थीम में विश्व स्तर पर इस बदलाव को लागू करने की कोशिश की लेकिन यह किसी कारण से काम नहीं आया।

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

@ ल्यूक सिम्पसन सही है। आप इसे theme.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 में खाली टैग भी डालना था। अन्यथा, संपादित पाठ के सभी गुण इसके द्वारा ओवरराइड हो रहे थे और मेरा संपादित पाठ ठीक से काम नहीं कर रहा था। और जब आप 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

किसी को अब भी "चाहता है संकेत " "में TextInputEditText " मेक 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

मुझे भी इस मुद्दे का सामना करना पड़ा है और आखिरकार हमें एंड्रॉइड 8.0 और एंड्रॉइड 8.1 पर दुर्घटना का कारण मिला।

पहला कारण (महत्वपूर्ण सुराग): खाली संकेत (android: hint = "") में xml oreo डिवाइस में क्रैश होता है। कृपया इस खाली संकेत को editText में पूरी प्रोजेक्ट खोज में हटा दें।

दूसरा कारण (जैसा कि ऊपर बताया गया है): सुनिश्चित करें कि आपका EditText संकेत TextInputLayout के अंदर दिखाना चाहिए, यदि आपने TextInputLayout का उपयोग किया है अन्यथा आप editText के अंदर संकेत का उपयोग कर सकते हैं।

आशा है कि यह मदद करो आप !!

धन्यवाद

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.