Android पर निष्क्रिय InputConnection चेतावनी पर getExtractedText


129

मुझे अपने लॉगकैट में निम्नलिखित चेतावनी मिलती है।

getExtractedText on inactive InputConnection

मैं इसके पीछे का कारण खोजने में असमर्थ हूं। कृपया सहायता कीजिए


4
मुझे समझ नहीं आ रहा है कि इस प्रश्न में अस्पष्ट / अस्पष्ट / अधूरा क्या है? मुझे यह चेतावनी मेरे ऐप को चलाते समय लॉगकोट में मिलती है, मैं इस चेतावनी का कारण जानना चाहता हूं।
पंकजगरवाल

2
मैं यह भी अपने आवेदन में है कि मैं विकसित कर रहा हूँ और मुझे पता नहीं है कि यह कहाँ से या क्यों आता है। अगर किसी को कभी पता चलता है, तो कृपया एक टिप्पणी पोस्ट करें। यह वास्तव में कई अन्य चेतावनियों को दिखाता है फिर "getExtractedText"। मैं यह भी देखता हूं: "startBatchEdit", "endBatchEdit", "getTextBeforeCursor" और कई और।
अवधि

1
इस प्रश्न पर एक नज़र रखने वाले मध्यस्थ हैं यदि नहीं, तो उन्हें करना चाहिए क्योंकि यदि वे अभी भी इस प्रश्न को अस्पष्ट और उभयचरी मानते हैं, तो १४ उठापटक के बाद भी मैं नहीं जानता कि क्या कहना है
पंकजागरवाल १३'१२

मैं सहमत हूं, यह एक समस्या है जिसका मुझे समाधान करने की आवश्यकता है। मुझे कारण का कोई पता नहीं है।
जॉनविलिस

3
इस त्रुटि के कारण आपके पास क्या कोड है?
छिपकली

जवाबों:


44

मैं इसी तरह के मुद्दे पर भाग गया। मेरा लोगो:

W/IInputConnectionWrapper(21214): getTextBeforeCursor on inactive InputConnection
W/IInputConnectionWrapper(21214): getSelectedText on inactive InputConnection
W/IInputConnectionWrapper(21214): getTextBeforeCursor on inactive InputConnection
W/IInputConnectionWrapper(21214): getTextAfterCursor on inactive InputConnection
...
I/Choreographer(20010): Skipped 30 frames!  The application may be doing too much work on its main thread.

मेरी स्थिति: मेरे पास उपयोगकर्ता प्रकारों में एक EditText है। उपयोगकर्ता द्वारा एक बटन दबाने पर EditText साफ़ हो जाता है। जब मैं बटन को तेजी से दबाता हूं तो बहुत सारे निष्क्रिय इनपुटकोइन्ट्री प्रविष्टियां निकलती हैं।

उदाहरण के लिए:

editText.setText(null);

ऊपर मेरे logcat में अंतिम पंक्ति क्या हो रहा है का एक बड़ा संकेत प्रदान करता है। निश्चित रूप से पर्याप्त, InputConnection पाठ को खाली करने के अनुरोधों से अभिभूत है। मैंने इसे साफ़ करने का प्रयास करने से पहले पाठ की लंबाई जांचने के लिए कोड को संशोधित करने की कोशिश की:

if (editText.length() > 0) {
    editText.setText(null);
}

यह समस्या को कम करने में मदद करता है कि बटन को तेजी से दबाने से IInputConnectionWrapper चेतावनियों की धारा का कारण नहीं बनता है। हालाँकि, यह तब भी समस्याओं का शिकार होता है जब उपयोगकर्ता किसी चीज़ को टाइप करने और बटन दबाने के बीच तेजी से वैकल्पिक होता है या जब ऐप पर्याप्त लोड के तहत होता है, तो बटन दबाता है, आदि।

सौभाग्य से, मुझे पाठ को साफ़ करने का एक और तरीका मिला: Editable.clear () । इसके साथ मुझे चेतावनी बिलकुल नहीं मिलती:

if (editText.length() > 0) {
    editText.getText().clear();
}

ध्यान दें कि आपको सभी इनपुट स्थिति को साफ करना चाहिए और न केवल पाठ (ऑटोटेक्स्ट, ऑटोकैप, मल्टीटैप, पूर्ववत), आप TextKeyListener.clear (संपादन योग्य ई) का उपयोग कर सकते हैं ।

if (editText.length() > 0) {
    TextKeyListener.clear(editText.getText());
}

1
मुझे IInputConnectionWrapper की चेतावनी भी मिल रही थी और मेरे ऐप को लगभग ANR, मेथड क्लियर () मेरे लिए काम आया ... सुपर अजीब बग, इससे पहले कि मैं सेटटैक्स सेट कर रहा था ("");
बॉक्स

17

अपडेट करें:

मुझे इनपुटकॉन्फेक्शन चेतावनियाँ मिलने का कारण यह नहीं था कि मैं कहाँ पाठ सेट कर रहा था (यानी, onTextChangedकॉलबैक में, या afterTextChanged) - यह इसलिए था क्योंकि मैं उपयोग कर रहा था setText

मुझे फोन करके समस्या हुई:

hiddenKeyboardText.getText().clear();
hiddenKeyboardText.append("some string");

नोट: मैं अभी भी afterTextChangedकॉलबैक में कॉल करता हूं , हालांकि यह बिना किसी चेतावनी के भी काम करता है ontextChanged

पिछला उत्तर:

मुझे लॉगकोट में भी समान संदेश मिल रहे थे, हालांकि मेरा परिदृश्य थोड़ा अलग था। मैं EditText (या रचित वर्ण / पेस्ट किए गए पाठ) में आने वाले प्रत्येक वर्ण को पढ़ना चाहता था, और फिर एक डिफ़ॉल्ट आरंभिक स्ट्रिंग के प्रश्न में EditText को रीसेट कर देता हूं।

स्पष्ट पाठ भाग ऊपर जॉनसन के समाधान के अनुसार काम करता है। हालांकि, पाठ को रीसेट करना समस्याग्रस्त था, और मुझे इनपुटकॉन्नेशन चेतावनी मिलेगी।

प्रारंभ में, मेरे onTextChanged(CharSequence s, ...)रूप में परिभाषित किया गया था:

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
    if (isResettingKeyboard)
        return;

    // ... do what needs to be done

    resetKeyboardString();

}

public void resetKeyboardString()
{
    isResettingKeyboard = true;

    hiddenKeyboardText.getText().clear();
    hiddenKeyboardText.setText(keyboardInitString);
    hiddenKeyboardText.setSelection(defaultKeyboardCursorLocation);

    isResettingKeyboard = false;
}

जब onTextChanged(...)कहा जाता है, तो EditText आसानी से मोड में होता है। मुझे यकीन नहीं है कि अगर इसका मतलब है कि हम इस getText.clear()पर कॉल से अधिक नहीं कर सकते हैं ( setText(...)कॉल का उत्पादन इनपुट चेतावनी भी है)।

हालाँकि, कॉलबैक afterTextChanged(Editable s)टेक्स्ट सेट करने के लिए सही जगह है।

@Override
public void afterTextChanged(Editable s) {

    if (isResettingKeyboard)
        return;

    resetKeyboardString();

    // ... 
}

यह, इस प्रकार, बिना किसी चेतावनी के काम करना है।


मुझे भी यही समस्या थी। मुझे एहसास हुआ कि हालांकि आपका समाधान इनपुटकनेक्ट चेतावनी को गायब कर देता है, मैंने देखा कि afterTextChangedविधि को और hiddenKeyboardText.getText().clear();साथ ही कहा जाता है hiddenKeyboardText.append("some string");, और इस तथ्य को भी ध्यान में रखा जाना चाहिए। मुझ से +1!
निक

@ सच है - सुनिश्चित करने के लिए महत्वपूर्ण if (isResettingKeyboard) return;शीर्ष पर है ...
आर्ष

7

मदद दस्तावेजों से

http://developer.android.com/reference/android/view/inputmethod/InputConnection.html

InputConnection इंटरफ़ेस एक इनपुटमेथोड से संचार चैनल है जो उस एप्लिकेशन पर वापस आता है जो इसका इनपुट प्राप्त कर रहा है। इसका उपयोग कर्सर के चारों ओर पाठ पढ़ने, पाठ बॉक्स पर पाठ करने, और आवेदन करने के लिए कच्ची घटनाओं को भेजने के लिए किया जाता है।

इसके अलावा, आगे पढ़ने से पता चलता है

getExtractedText (): यह विधि या तो विफल हो सकती है यदि इनपुट कनेक्शन अमान्य हो गया है (जैसे कि इसकी प्रक्रिया क्रैश हो रही है) या क्लाइंट को पाठ के साथ प्रतिक्रिया करने में बहुत समय लग रहा है (इसे वापस लौटने के लिए कुछ सेकंड दिए जाते हैं) । या तो मामले में, एक नल वापस आ गया है।

यह इस तरह के पाठ में बदलावों की निगरानी करने और परिवर्तनों को सचेत करने के लिए भी प्रतीत होता है।

इस समस्या का शिकार करने के लिए, आपको किसी भी डेटाबेस के प्रश्नों का पता लगाना होगा, जो शायद आप किसी लेआउट में लिस्ट व्यू या लिस्ट के आसपास कर रहे हैं।

यदि आपके पास कोई दृश्य नहीं है, उदाहरण के लिए यह पृष्ठभूमि में बेतरतीब ढंग से हो रहा है, तो मैं सुझाव दूंगा कि इसका यूआई तत्व मुद्दा नहीं है, इसलिए टेक्स्टफील्ड और इस तरह की उपेक्षा करें। यह एक पृष्ठभूमि सेवा हो सकती है जो किसी कर्सर में जानकारी संग्रहीत कर रही है या एक कर्सर का अनुरोध कर रही है।

इसके अलावा, क्या समस्या आपके ऐप से उत्पन्न हुई है? या शायद किसी और का है जिसे आपने हाल ही में स्थापित किया है। पूर्ण लॉगकैट ट्रेस की सूची बनाएं। कोई इस मुद्दे को पहचान सकता है।

मुझे इस बात का अंदाजा होगा कि अगर आपने इसके आस-पास कुछ विशिष्ट नहीं लिखा है कि इसका कोई लॉग संदेश, या शायद आपके द्वारा उपयोग की जा रही लाइब्रेरी है?


1
धन्यवाद, मैं डीबी प्रश्न करता हूं, लेकिन अजीब रूप से यह चेतावनी एमुलेटर पर ऐप चलाते समय दिखाई नहीं देती है, इसलिए यह वास्तव में मेरे डिवाइस पर इंस्टॉल किए गए कुछ अन्य ऐप के कारण हो सकता है। इस दिशा में
देखेंगे

मुझे लगता है कि नवीनतम logCat आपके संदेशों को अन्य एप्लिकेशन से अलग दिखाता है, फ़िल्टर किया हुआ। हालांकि यह पुष्टि करने के लिए पर्याप्त रूप से इसका उपयोग नहीं किया गया है। आप एक नया खाली ऐप बना सकते हैं, और लॉग कैट देख सकते हैं कि क्या त्रुटि होती है, जो आपके ऐप को समाप्त कर देगा। मुद्दा होने से।
एमिल

जरूरी नहीं कि @frieza अन्य ऐप। मैंने ArrayAdapter को sqlite के साथ जोड़ा है और अब मुझे यह चेतावनी फोन पर भी मिल रही है। मुझे लगता है कि आप एमुलेटर पर कोई त्रुटि नहीं देखते हैं क्योंकि यह धीमा है और प्रदर्शन थ्रेसहोल्ड को एक परिणाम के रूप में अक्षम किया जा रहा है।
अलंदारेव

7

मुझे भी यही समस्या आ रही थी। चेतावनी तब दिखाई दी जब मेरे EditTextsऔर मेरे एक गतिविधि में सॉफ्ट कीबोर्ड सक्रिय हो गए ।

मैंने जो कुछ किया वह ऑनपॉज़ में कीबोर्ड को छिपाने के लिए था ();

@Override
protected void onPause() {

    // hide the keyboard in order to avoid getTextBeforeCursor on inactive InputConnection
    InputMethodManager inputMethodManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);

    inputMethodManager.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);

    super.onPause();
}

2
यह सब ठीक है। सुनिश्चित करें कि आप वर्तमान में स्क्रीन पर मौजूद गतिविधि से दूर जाने से पहले कीबोर्ड को छिपाते हैं।
गबर

1

अपने लिए इस मुद्दे को हल किया है शायद आपको भी यही समस्या है।

यह एक के कारण हुई थी वस्तु में HeaderView की सूची एडाप्टर

मैंने एक दृश्य फुलाया और ऑब्जेक्ट घोषित किया और उस पर एक टेक्स्टवॉकर डाला ।

View v = LayoutInflater.from(CONTEXT).inflate(R.layout.in_overscrollview, null);
Object= (Object) v.findViewById(R.id.OBJECT_ID);

Object.addTextChangedListener(new TextWatcher() {
        @Override
        public void afterTextChanged(Editable s) {
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after){
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
        //Do my work
        //Update my view
        }
});

इसे लिस्ट एडॉप्टर में जोड़ा और एडेप्टर का निर्माण किया।

JobListView = (ListView) getListView().findViewWithTag("JOBLISTVIEWTAG");
JobListView.addHeaderView(v, null, false);
JobsAdapter = new IN_JOBS_ADAPTER(CONTEXT, ITEMS_FOR_ADATER);
ListView.setAdapter(JOBSadapter);

सब कुछ ठीक है टेक्स्ट वॉचर काम करता है।

लेकिन अगर मैंने शुरुआती बिल्ड के बाद एडाप्टर को फिर से बनाया है।

JobsAdapter = new IN_JOBS_ADAPTER(CONTEXT, DIFFERENT_ITEMS_FOR_ADAPTER);
ListView.setAdapter(JOBSadapter);

उस HeaderView का पुनर्निर्माण भी किया गया है।

वह चेतावनी दिखाएगा क्योंकि ऑब्जेक्ट हटा दिया गया था और टेक्स्ट वॉचर अभी भी इसके लिए देख रहा था।

सूची एडाप्टर और वस्तु बदल दिया गया है, और मेरा अनुमान है कि पाठ चौकीदार जब यह हुआ दूसरा रास्ता देख रहा था।

तो चेतावनी बंद हो जाती है और चमत्कारिक रूप से टेक्स्ट वॉचर हेडर व्यू और ऑब्जेक्ट को ढूंढता है । लेकिन यह फोकस खो देता है और उस चेतावनी को लॉग करता है।

का उपयोग करते हुए

JOBSadapter.notifyDataSetChanged();

मुद्दा तय किया।

परन्तु यदि आपके पास कोई वस्तु है के अंदर एडाप्टर , और पाठ देखभाल से जुड़ा हुआ है वस्तु के अंदर एडाप्टर । फिर आपको थोड़ा और काम करने की आवश्यकता हो सकती है।

श्रोता को हटाने की कोशिश करें और जो भी काम आप कर रहे हैं उसे करने के बाद उसे फिर से संलग्न करें।

Object.removeTextChangedListener();

या

Object.addTextChangedListener(null);

1

एंटोनियोम के उत्तर के अलावा, सुनिश्चित करें कि आगे की जाने वाली किसी भी क्रिया को वास्तव में कीबोर्ड को छिपाने के बाद किया जाता है, इसलिए यदि आपने कीबोर्ड को नीचे की तरह छिपाया है:

public void hideKeyboard() {
InputMethodManager inputMethodManager =(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
}

, आपको सफल कार्य करने की आवश्यकता है ताकि कीबोर्ड छुपा कर पोस्ट किया जा सके, जैसे:

getWindow().getDecorView().post(new Runnable() {            
        @Override
        public void run() {
            finish(); //Sample succeeding code
     }
});

0

मुझे यह समस्या तब हुई जब मुझे EditText से पाठ को संशोधित या प्राप्त करना पड़ा और यह केंद्रित था।

इसलिए इसे संशोधित करने या प्राप्त करने से पहले, मैंने कीबोर्ड बंद कर दिया और मैं इसे ठीक कर देता हूं।

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);

हो सकता है, आपकी समस्या अलग हो।


0

मैंने अपनी समस्या को xml पर एक इनपुट प्रकार डालने में हल किया था: android: inputType = "none | text |CapScript | textUri"

इससे पहले कि Android था: inputType = "text" इससे मेरी समस्या हल हो गई।


3
मेरे लिए कुछ नहीं किया।
DSlomer64

0

Logcat में त्रुटि: getTextBeforeCursor को निष्क्रिय InputConnection पर

समाधान: अपना इनपुट कीबोर्ड छिपाएं और एप्लिकेशन को चलाएं।


0

EditText को क्लियर करने से पहले सॉफ्टवेयर कीबोर्ड छिपाएं - चेतावनी नहीं दिखाई जाएगी।

इसके अलावा, यह डिवाइस विशिष्ट लगता है । मैंने इसे केवल Nexus 4 (Android 7.1) पर देखा है। एमुलेटर (8.0, 7.1) या नेक्सस 5 पर कोई चेतावनी नहीं।


0

मेरी समस्या का दृश्यता सेट करने के कारण हुई थी EditTextकरने के लिए GONEतुरंत और फिर इसे स्थापित करनेVISIBLE हर बार उपयोगकर्ता ने एक चरित्र टाइप किया, क्योंकि मैं इनपुट पर सत्यापन को हर बार पाठ बदल रहा था और कुछ मामलों में दृश्य को छिपाना आवश्यक था।

इसलिए समाधान यूआई या राज्य अपडेट के बीच जीओएन के दृश्य या लेआउट की दृश्यता को सेट करने से बचने के लिए है, क्योंकि EditTextफोकस खो सकता है


0

iface एक ही समस्या है और इसे स्टेटफुल विजेट में मेरे स्टेटलेस विजेट में कनवर्ट करके ठीक कर सकते हैं

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