मुझे अपने लॉगकैट में निम्नलिखित चेतावनी मिलती है।
getExtractedText on inactive InputConnection
मैं इसके पीछे का कारण खोजने में असमर्थ हूं। कृपया सहायता कीजिए
मुझे अपने लॉगकैट में निम्नलिखित चेतावनी मिलती है।
getExtractedText on inactive InputConnection
मैं इसके पीछे का कारण खोजने में असमर्थ हूं। कृपया सहायता कीजिए
जवाबों:
मैं इसी तरह के मुद्दे पर भाग गया। मेरा लोगो:
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());
}
अपडेट करें:
मुझे इनपुटकॉन्फेक्शन चेतावनियाँ मिलने का कारण यह नहीं था कि मैं कहाँ पाठ सेट कर रहा था (यानी, 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;
शीर्ष पर है ...
मदद दस्तावेजों से
http://developer.android.com/reference/android/view/inputmethod/InputConnection.html
InputConnection इंटरफ़ेस एक इनपुटमेथोड से संचार चैनल है जो उस एप्लिकेशन पर वापस आता है जो इसका इनपुट प्राप्त कर रहा है। इसका उपयोग कर्सर के चारों ओर पाठ पढ़ने, पाठ बॉक्स पर पाठ करने, और आवेदन करने के लिए कच्ची घटनाओं को भेजने के लिए किया जाता है।
इसके अलावा, आगे पढ़ने से पता चलता है
getExtractedText (): यह विधि या तो विफल हो सकती है यदि इनपुट कनेक्शन अमान्य हो गया है (जैसे कि इसकी प्रक्रिया क्रैश हो रही है) या क्लाइंट को पाठ के साथ प्रतिक्रिया करने में बहुत समय लग रहा है (इसे वापस लौटने के लिए कुछ सेकंड दिए जाते हैं) । या तो मामले में, एक नल वापस आ गया है।
यह इस तरह के पाठ में बदलावों की निगरानी करने और परिवर्तनों को सचेत करने के लिए भी प्रतीत होता है।
इस समस्या का शिकार करने के लिए, आपको किसी भी डेटाबेस के प्रश्नों का पता लगाना होगा, जो शायद आप किसी लेआउट में लिस्ट व्यू या लिस्ट के आसपास कर रहे हैं।
यदि आपके पास कोई दृश्य नहीं है, उदाहरण के लिए यह पृष्ठभूमि में बेतरतीब ढंग से हो रहा है, तो मैं सुझाव दूंगा कि इसका यूआई तत्व मुद्दा नहीं है, इसलिए टेक्स्टफील्ड और इस तरह की उपेक्षा करें। यह एक पृष्ठभूमि सेवा हो सकती है जो किसी कर्सर में जानकारी संग्रहीत कर रही है या एक कर्सर का अनुरोध कर रही है।
इसके अलावा, क्या समस्या आपके ऐप से उत्पन्न हुई है? या शायद किसी और का है जिसे आपने हाल ही में स्थापित किया है। पूर्ण लॉगकैट ट्रेस की सूची बनाएं। कोई इस मुद्दे को पहचान सकता है।
मुझे इस बात का अंदाजा होगा कि अगर आपने इसके आस-पास कुछ विशिष्ट नहीं लिखा है कि इसका कोई लॉग संदेश, या शायद आपके द्वारा उपयोग की जा रही लाइब्रेरी है?
मुझे भी यही समस्या आ रही थी। चेतावनी तब दिखाई दी जब मेरे 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();
}
अपने लिए इस मुद्दे को हल किया है शायद आपको भी यही समस्या है।
यह एक के कारण हुई थी वस्तु में 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);
एंटोनियोम के उत्तर के अलावा, सुनिश्चित करें कि आगे की जाने वाली किसी भी क्रिया को वास्तव में कीबोर्ड को छिपाने के बाद किया जाता है, इसलिए यदि आपने कीबोर्ड को नीचे की तरह छिपाया है:
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
}
});
मुझे यह समस्या तब हुई जब मुझे EditText से पाठ को संशोधित या प्राप्त करना पड़ा और यह केंद्रित था।
इसलिए इसे संशोधित करने या प्राप्त करने से पहले, मैंने कीबोर्ड बंद कर दिया और मैं इसे ठीक कर देता हूं।
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
हो सकता है, आपकी समस्या अलग हो।
मैंने अपनी समस्या को xml पर एक इनपुट प्रकार डालने में हल किया था: android: inputType = "none | text |CapScript | textUri"
इससे पहले कि Android था: inputType = "text" इससे मेरी समस्या हल हो गई।
मेरी समस्या का दृश्यता सेट करने के कारण हुई थी EditText
करने के लिए GONE
तुरंत और फिर इसे स्थापित करनेVISIBLE
हर बार उपयोगकर्ता ने एक चरित्र टाइप किया, क्योंकि मैं इनपुट पर सत्यापन को हर बार पाठ बदल रहा था और कुछ मामलों में दृश्य को छिपाना आवश्यक था।
इसलिए समाधान यूआई या राज्य अपडेट के बीच जीओएन के दृश्य या लेआउट की दृश्यता को सेट करने से बचने के लिए है, क्योंकि EditText
फोकस खो सकता है
iface एक ही समस्या है और इसे स्टेटफुल विजेट में मेरे स्टेटलेस विजेट में कनवर्ट करके ठीक कर सकते हैं