web-dev-qa-db-fra.com

getExtreasedText sur l'avertissement InputConnection inactif 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

115
pankajagarwal

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 tape. Le texte d'édition est effacé lorsque l'utilisateur appuie sur un bouton. De nombreuses entrées InputConnection inactives sont émises 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. Effectivement, 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 l'effacer:

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

Cela permet d'atténuer le problème, car appuyer rapidement sur le bouton ne provoque plus le flux d'avertissements IInputConnectionWrapper. Toutefois, cela pose toujours des problèmes lorsque l’utilisateur alterne rapidement entre la saisie et l’appui sur le bouton ou appuie sur le bouton lorsque l’application est suffisamment chargée, etc.

Heureusement, j'ai trouvé un autre moyen de supprimer du 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 de la saisie et pas seulement le texte (autotext, autocap, multitap, undo), vous pouvez utiliser TextKeyListener.clear (éditable e) .

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

Mettre à jour:  

La raison pour laquelle je recevais des avertissements InputConnection n'était pas à cause de l'endroit où je plaçais le texte (c'est-à-dire dans le rappel onTextChanged ou le afterTextChanged) - c'était parce que j'utilisais setText.

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

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

Remarque: Je passe toujours l'appel dans le rappel afterTextChanged, bien que cela fonctionne également sans les 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 chaque caractère entrant dans EditText (ou des caractères composés/du texte collé), puis réinitialiser le EditText en question sur 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 j'obtiendrais des avertissements de connexion aux entrées.

Initialement, ma onTextChanged(CharSequence s, ...) était définie comme suit: 

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

Lorsque onTextChanged(...) est appelé, EditText est en mode lecture seule. Je ne sais pas si cela signifie que nous ne pouvons pas faire plus que d'appeler getText.clear() dessus (les appels 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;

    resetKeyboardString();

    // ... 
}

C’est fonctionner jusqu’à présent sans aucun avertissement. 

14
ahash

À partir des documents d'aide

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

L’interface InputConnection est le canal de communication d’un fichier InputMethod à l'application qui reçoit son entrée. Il est utilisé pour effectuer des opérations telles que la lecture de texte autour du curseur, valider du texte dans la zone de texte et envoyer des événements de clé brute au application.

De plus, des lectures complémentaires montrent

getExtreatedText (): Cette méthode peut échouer si la connexion en entrée est devenue invalide (par exemple, le processus est en panne) ou le client prend trop de temps pour répondez avec le texte (il vous reste quelques secondes pour revenir). Dans Dans les deux cas, une valeur null est renvoyée.

Il semble également surveiller les modifications apportées à ce texte et alerter les modifications.

Pour résoudre le problème, vous devez explorer toutes les requêtes de base de données que vous effectuez, par exemple autour de listViews ou de listes dans un modèle.

Si vous n'avez pas d'opinion, par exemple si cela se produit de manière aléatoire en arrière-plan, je suggérerais alors que ce n'est pas un problème d'élément d'interface utilisateur, alors ignorez les champs de texte, etc. 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. Répertorie la trace complète de logCat. Quelqu'un pourrait reconnaître le problème. 

Je me risquerais à supposer que si vous n'avez pas écrit quelque chose de spécifique à ce sujet qui est un message de journal elses, ou peut-être celui d'une bibliothèque que vous utilisez?

7
Emile

J'avais le même problème. L'avertissement est apparu lorsque le clavier logiciel a été activé dans l'un de mes EditTexts et que l'activité a perdu la concentration.

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

En plus de la réponse d'Antoniom, assurez-vous que toutes les actions supplémentaires à effectuer sont réellement effectuées après avoir masqué le clavier. Si vous avez masqué 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 effectuer les actions suivantes après la dissimulation du clavier, comme suit:

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

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

Cela était dû à un objet dans le HeaderView de l'adaptateur List.

J'ai gonflé un View et déclaré le Object et mis un TextWatcher dessus.

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

Ajouté à l'adaptateur List 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 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 parce que Object avait été supprimé et que l'observateur de texte était toujours configuré pour le surveiller.

Le List Adapter et le Object ont été remplacés et je suppose que le Text Watcher regardait ailleurs quand cela s'est produit.

Ainsi, l'avertissement disparaît et le Text Watcher trouve miraculeusement le HeaderView et le 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 Adapter et que Text Watcher est attaché à Object à l'intérieur de Adapter. Ensuite, vous devrez peut-être faire un peu plus de travail.

Essayez de retirer le récepteur et de le remettre en place après avoir effectué le travail que vous avez effectué.

Object.removeTextChangedListener();

ou

Object.addTextChangedListener(null);
1
Xjasz

Cache le clavier du logiciel avant d'effacer EditText - les avertissements ne seront pas affichés.

En outre, il semble être spécifique à l'appareil . Je ne l'ai vu que sur Nexus 4 (Android 7.1). Aucun avertissement sur les émulateurs (8.0, 7.1) ou Nexus 5.

0
Inoy

Erreur dans Logcat: getTextBeforeCursor sur InputConnection inactif

Solution: Hide Your Input Keyboard et lancez l'application.

0
shyam

J'avais résolu mon problème en insérant un type d'entrée sur XML comme ceci: Android: inputType = "none | text | textCapWords | textUri"

avant c'était Android: inputType = "text" Cela a résolu mon problème.

0

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

Donc avant de modifier ou d’obtenir, j’ai fermé le clavier et je l’ai corrigé.

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

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

0
Angelo Moroni