getExtractedText sur l’avertissement Inactive InputConnection sur Android

Je reçois l’avertissement suivant dans mon logcat.

getExtractedText on inactive InputConnection 

Je suis incapable de trouver la raison derrière cela. S’il vous plaît aider

J’ai rencontré un problème similaire. Mon logcat:

 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. 

Ma situation: J’ai une vue EditText dans laquelle l’utilisateur entre. EditText est effacé lorsque l’utilisateur appuie sur un bouton. Beaucoup d’entrées InputConnection inactives sont diffusées lorsque j’appuie rapidement sur le bouton.

Ex:

 editText.setText(null); 

La dernière ligne de mon logcat ci-dessus fournit une excellente indication de ce qui se passe. Bien sûr, InputConnection est submergé par les demandes d’effacement du texte. J’ai essayé de modifier le code pour vérifier la longueur du texte avant d’essayer de le supprimer:

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

Cela permet d’atténuer le problème en appuyant rapidement sur le bouton ne provoque plus le stream d’avertissements IInputConnectionWrapper. Cependant, ceci est toujours sujet à des problèmes lorsque l’utilisateur alterne rapidement entre taper quelque chose et appuyer sur le bouton ou appuyer sur le bouton lorsque l’application est suffisamment chargée, etc.

Heureusement, j’ai trouvé un autre moyen d’effacer le texte: Editable.clear () . Avec cela, je ne reçois aucun avertissement:

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

Notez que si vous souhaitez effacer tout l’état d’entrée et pas seulement le texte (autotext, autocap, multitap, annuler), vous pouvez utiliser TextKeyListener.clear (Editable e) .

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

Mettre à jour:

La raison pour laquelle je recevais des avertissements InputConnection n’était pas à cause de l’emplacement du texte (c’est-à-dire dans le rappel onTextChanged ou afterTextChanged ) – c’était parce que j’utilisais setText .

J’ai contourné le problème en appelant:

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

Remarque: Je continue à effectuer l’appel dans le rappel afterTextChanged , même s’il fonctionne également sans avertissements de ontextChanged .

Réponse précédente:

Je recevais également des messages identiques dans logcat, même si mon scénario était légèrement différent. Je voulais lire tous les caractères entrés dans EditText (ou les caractères composés / texte collé), puis réinitialiser le EditText en question à une chaîne d’initialisation par défaut.

La partie en texte clair fonctionne selon la solution de Johnson ci-dessus. Cependant, la réinitialisation du texte était problématique et je recevais des avertissements de connexion d’entrée.

Initialement, mon onTextChanged(CharSequence s, ...) été défini comme suit:

 @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (isResettingKeyboard) return; // ... do what needs to be done resetKeyboardSsortingng(); } public void resetKeyboardSsortingng() { isResettingKeyboard = true; hiddenKeyboardText.getText().clear(); hiddenKeyboardText.setText(keyboardInitSsortingng); hiddenKeyboardText.setSelection(defaultKeyboardCursorLocation); isResettingKeyboard = false; } 

Lorsque onTextChanged(...) est appelé, le EditText est en mode readonly. Je ne suis pas sûr que cela signifie que nous ne pouvons pas faire plus que d’appeler getText.clear() (les setText(...) produisent également des avertissements inputConnection).

Cependant, le callback afterTextChanged(Editable s) est le bon endroit pour définir le texte.

 @Override public void afterTextChanged(Editable s) { if (isResettingKeyboard) return; resetKeyboardSsortingng(); // ... } 

Ceci, jusqu’à présent, fonctionne sans aucun avertissement.

À partir des documents d’aide

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

L’interface InputConnection est le canal de communication entre une méthode InputMethod et l’application qui reçoit son entrée. Il permet notamment de lire du texte autour du curseur, d’envoyer du texte dans la zone de texte et d’envoyer des événements de clé bruts à l’application.

En outre, d’autres spectacles de lecture

getExtractedText (): cette méthode peut échouer si la connexion en entrée est devenue invalide (par exemple, son processus en panne) ou si le client prend trop de temps pour répondre avec le texte (quelques secondes suffisent pour le renvoyer) . Dans les deux cas, un null est renvoyé.

Il semble également surveiller les modifications apscopes à ce texte et les modifications des alertes.

Pour résoudre le problème, vous devez explorer toutes les requêtes de firebase database que vous effectuez, peut-être autour de listViews ou de listes dans une mise en page.

Si vous n’avez pas de vue, par exemple si cela se produit aléatoirement en arrière-plan, alors je suggère que ce n’est pas un problème d’élément d’interface utilisateur, donc ignorez les champs de texte et autres. Il peut s’agir d’un service d’arrière-plan qui stocke des informations dans un curseur ou demande un curseur.

En outre, le problème provient-il de votre application? ou peut-être quelqu’un d’autre que vous avez installé récemment. Lister la trace logCat complète. Quelqu’un pourrait reconnaître le problème.

Je devinerais que si vous n’avez pas écrit quelque chose de spécifique à ce sujet, quelqu’un d’autre écrit un message, ou peut-être celui d’une bibliothèque que vous utilisez?

J’avais le même problème. L’avertissement est apparu lorsque le clavier EditTexts était activé dans l’un de mes EditTexts et que l’activité perd le focus.

Ce que j’ai fait était de cacher le clavier dans onPause ();

 @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(); } 

Résolu ce problème pour moi, peut-être que vous avez le même problème.

Cela était dû à un object dans le HeaderView de l’ adaptateur de liste .

J’ai gonflé une vue et déclaré l’ object et y ai placé un TextWatcher .

 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 } }); 

Il l’a ajouté à l’ adaptateur de liste et construit l’adaptateur.

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

Tout va bien le Text Watcher fonctionne.

MAIS si j’ai déjà reconstruit l’adaptateur après la construction initiale.

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

Ce HeaderView est également reconstruit.

Cet avertissement s’afficherait, car l’ object a été supprimé et l’observateur de texte était toujours en train de le surveiller.

L’ adaptateur de liste et l’ object ont été remplacés, et je devine que l’ observateur de texte regardait dans le sens inverse.

Ainsi, l’avertissement s’éteint et, miraculeusement, le Text Watcher détecte le HeaderView et l’ object . Mais il perd le focus et enregistre cet avertissement.

En utilisant

 JOBSadapter.notifyDataSetChanged(); 

résolu le problème.

MAIS si vous avez un object à l’intérieur de l’ adaptateur , et que l’ observateur de texte est attaché à l’ object à l’intérieur de l’ adaptateur . Ensuite, vous devrez peut-être faire un peu plus de travail.

Supprimez le Listener et connectez-le à nouveau après avoir effectué le travail que vous êtes en train de faire.

 Object.removeTextChangedListener(); 

ou

 Object.addTextChangedListener(null); 

En dehors de la réponse d’Antoniom, assurez-vous que toutes les actions supplémentaires doivent être effectuées, sont vraiment faites après avoir caché le clavier, donc si vous avez caché le clavier comme celui ci-dessous:

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

, vous devez avoir les actions suivantes effectuées après le masquage du clavier, comme ceci:

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

J’ai eu ce problème quand je devais modifier ou obtenir du texte à partir de EditText et il était concentré.

Donc, avant de modifier ou d’obtenir, je ferme le clavier et je le répare.

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

Peut-être que votre problème est différent.

J’avais résolu mon problème en insérant un type de saisie sur xml comme ceci: android: inputType = “none | text | textCapWords | textUri”

avant cela était Android: inputType = “text” Cela a résolu mon problème.

Erreur dans Logcat: getTextBeforeCursor sur InputConnection inactif

Solution: masquez votre clavier d’entrée et exécutez l’application.