2010-11-26 4 views
21

Je ne comprends pas pourquoi ce morceau de code ne fonctionne pas. Seuls les retours arrière et les touches de retour sont détectés. L'écouteur ne se déclenche pour aucune autre clé. Mon appareil est Nexus One.onKeyListener ne fonctionne pas sur le clavier virtuel

J'ai essayé de surcharger la méthode OnKeyDown de l'activité et c'est encore pire. Le seul bouton détecté était le bouton de retour matériel.

Je vois autour d'une suggestion pour utiliser TextWatcher et onTextChanged, alors que cela pourrait fonctionner dans certains cas, ce n'est pas un vrai problème. Par exemple, si la zone de texte est vide, vous ne détecterez pas si l'utilisateur appuie sur le bouton BackSpace (Supprimer). Alors, des idées?

 TextView txtInput = (TextView)findViewById(R.id.txtInput); 
    txtInput.setOnKeyListener(new View.OnKeyListener() { 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      makeToast(keyCode + " key pressed"); 
      return true; 
     } 
    }); 
+0

Eh bien, j'ai passé 4 bonnes heures sur ce problème. Il semble que personne n'a de solution pour cela. Peu de gens suggèrent également d'utiliser OnKeyboardActionListener, mais ne trouvent aucun exemple sur la façon de l'utiliser. – bobetko

+0

Exemple trouvé ici: http://developer.android.com/resources/samples/SoftKeyboard/src/com/example/android/softkeyboard/SoftKeyboard.html – bobetko

+0

Je ne suis pas sûr que l'exemple de touches programmables fonctionnera pour moi. Je ne veux pas écrire une autre méthode de saisie. Je veux simplement montrer la méthode de saisie par défaut sur l'écran (clavier android habituellement) et capturer n'importe quelle touche. Pourquoi cette tâche semble si décourageante? Je suis frustré. – bobetko

Répondre

18

Ok. J'ai finalement compris comment faire ce que je veux, et je ne suis pas fier sur Android pour cela. J'écris l'application serveur/client où sur le client je dois ouvrir le SoftKeyboard et envoyer les clefs pressées (caractères et touche DEL) ... Chaque fois que la clef est pressée, ce caractère est envoyé au serveur. Si vous appuyez sur DEL, j'envoie la séquence {BS} au serveur. Pour ce faire, j'ai dû implémenter TextWatcher et onTextChange qui fonctionne bien sauf dans les situations où EditText est vide et que l'utilisateur appuie sur la touche DEL. Comme il n'y a pas de modification dans EditText, il n'y a aucun moyen de détecter que la touche SUPPR est enfoncée.

En plus de TextWatcher, j'ai dû implémenter onKeyListener que j'ai attaché à mon contrôle EditText. Cette onKeyListener ignore toutes les clés de SoftKeyboard sauf DEL et RETURN. Pas certain de pourquoi? Un bug peut-être?

Voici mon code:

TextView txtInput = (TextView)findViewById(R.id.txtInput); 
    txtInput.addTextChangedListener(inputTextWatcher); 

    txtInput.setOnKeyListener(new View.OnKeyListener() { 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      Log.d(TAG, keyCode + " character(code) to send"); 
      return false; 
     } 
    }); 

et TextWatcher ....

private TextWatcher inputTextWatcher = new TextWatcher() { 
    public void afterTextChanged(Editable s) { } 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) 
     { } 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     Log.d(TAG, s.charAt(count-1) + " character to send");;   
    } 
}; 
+0

Il est en effet irritant que certains claviers ne semblent pas envoyer les codes de clés onkeyup (par exemple, le clavier par défaut de Samsung sur un S3/S4). Vous devez contourner le problème en regardant le texte modifié à la place ... – kenyee

+1

qu'en est-il lorsqu'il n'y a pas de caractère et que l'utilisateur appuie sur la touche retour? – Arslan

4

Vous avez fait une erreur ici.
il devrait return true, Si vous avez géré l'événement. Si vous voulez permettre à l'événement à traiter par le récepteur suivant, return false
Vous êtes toujours vrai retournerez

+0

Merci d'avoir précisé cela. J'ai effectivement essayé de retourner faux aussi. En lisant je me suis dit que je devais utiliser onKeyboardActionListener. J'y passerai du temps demain. THX. – bobetko

0

Nous avions le problème TextWatcher sur iPhone aussi bien - si le tampon est vide, le clavier ne pas envoyer del un événement. Nous avons travaillé autour d'elle en préchargeant le tampon du clavier avec 1000 caractères. Heureusement, notre application a caché le champ d'édition derrière le clavier afin que les 1000 caractères ne soient pas vus. C'est moche, mais ça marche (sauf si l'utilisateur frappe 1000 suppressions dans une rangée avant d'entrer n'importe quelles données!)

2

Avez-vous essayé d'utiliser la sous-classe d'écouteur spécifique pour cette vue?

J'ai eu un problème similaire avec un EditText. Le code ci-dessous travaillé:

private OnKeyListener keyListener = new EditText.OnKeyListener(){ 

    @Override 
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
     EditText et = (EditText) v; 
     Log.i("APPEVENT", "Key hit: "+ event); 
     //... 
     return false; 
    } 

}; 

Mais si je le View.OnKeyListener, je ne backspace et entrez enregistrement. Il pourrait être un problème similaire avec TextView. Peut-être que les écouteurs de clé de sous-classe sont sensibles à plus d'événements pour la sous-classe View donnée.

3

Remarque: entrez la mention de type dans votre edittext.

<EditText android:id="@+id/select_category" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:inputType="textCapSentences|textAutoCorrect" > 



edittext.setOnEditorActionListener(new OnEditorActionListener() { 

      @Override 
      public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 

       if ((actionId & EditorInfo.IME_MASK_ACTION) == EditorInfo.IME_ACTION_DONE) { 
        //do something here. 
        return true; 
       } 
       return false; 
      } 
     }); 
+0

celui-ci a résolu mon problème avec le clavier Mimuum. Cela fonctionne-t-il sans imeOptions comme dans votre code? – Goufalite

Questions connexes