63 votes

Comment attraper une touche "Terminé" sur le clavier tactile

Comment intercepter des événements clés spécifiques à partir du clavier logiciel? spécifiquement, je suis intéressé par la touche "Terminé".

merci, Ori

60voto

Swato Points 513

Je ne sais pas trop quel type d'auditeur a été utilisé dans la réponse acceptée. J'ai utilisé les OnKeyListener attachés à un EditText et il n'a pas été en mesure d'attraper le prochain, ni de le faire.

Cependant, utiliser OnEditorActionListener fonctionnait et cela me permettait également de les différencier en comparant la valeur d'action à des constantes définies EditorInfo.IME_ACTION_NEXT et EditorInfo.IME_ACTION_DONE .

 editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId & EditorInfo.IME_MASK_ACTION) {
            doSomething();
            return true;
        }
        else {
            return false;
        }
    }
});
 

39voto

Jason Axelson Points 587

@Swato la réponse n'était pas terminé pour moi (et ne compile pas!) donc, je vous montre comment faire la comparaison avec ce qui est FAIT et les PROCHAINES actions.

editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
        int result = actionId & EditorInfo.IME_MASK_ACTION;
        switch(result) {
        case EditorInfo.IME_ACTION_DONE:
            // done stuff
            break;
        case EditorInfo.IME_ACTION_NEXT:
            // next stuff
            break;
        }
    }
});

Aussi, je tiens à souligner que pour JellyBean et plus OnEditorActionListener est nécessaire pour écouter les 'enter' ou 'suivant' et vous ne pouvez pas utiliser OnKeyListener. À partir de la documentation:

Aussi douce méthodes de saisie peut utiliser plusieurs et inventive, des moyens de saisie de texte, il n'y a aucune garantie que tout à une touche sur un clavier logiciel va générer un événement clé: ceci est laissé à l'IME de la discrétion, et en fait de l'envoi de tels événements est découragé. Vous ne devez jamais compter sur la réception de KeyEvents pour une touche sur un soft de méthode d'entrée.

Référence: http://developer.android.com/reference/android/view/KeyEvent.html

31voto

Mia Clarke Points 4525

Vous attrapez le KeyEvent puis vérifiez son code d'activation. FLAG_EDITOR_ACTION est utilisé pour identifier les clés d'entrée provenant d'un IME dont la clé d'entrée a été étiquetée automatiquement "next" ou "done".

 if (event.getKeyCode() == KeyEvent.FLAG_EDITOR_ACTION)
    //your code here
 

Trouvez les documents ici .

8voto

Siraj Uddin Points 128
    etSearchFriends = (EditText) findViewById(R.id.etSearchConn);
    etSearchFriends.setOnKeyListener(new OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // If the event is a key-down event on the "enter" button
            if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
                (keyCode == KeyEvent.KEYCODE_ENTER)) {
                Toast.makeText(ACTIVITY_NAME.this, etSearchFriends.getText(),Toast.LENGTH_SHORT).show();
              return true;
            }
            return false;
        }

    }); 

1voto

Ranko1977 Points 1

J'ai EditText que les recherches de noms, et il affiche automatiquement les résultats ci-dessous dans la liste. SoftInput clavier seulement montré le bouton "suivant" et entrez le signe - qui n'a rien fait. Je voulais seulement Faire bouton (pas de next ou enter signe) et aussi je voulais quand il était pressé, il doit fermer le clavier, car l'utilisateur doit voir les résultats ci-dessous il.

La Solution que j'ai trouvé /par M. Cyril Mottier sur son blog/ était très simple, et cela a fonctionné sans aucun code supplémentaire: en xml où EditText est situé, cela devrait être écrit: android:imeOptions="actionDone"

afin de se faufiler clavier avec bouton Terminé, EditText devrait ressembler à ceci:

<EditText
        android:id="@+id/editText1central"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/imageView1"
        android:layout_toLeftOf="@+id/imageView2tie"
        android:ems="10"
        android:imeOptions="actionDone"
        android:hint="@string/trazi"
        android:inputType="textPersonName" />

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X