web-dev-qa-db-fra.com

Android - Obtenir une touche du clavier

Je veux attraper la pression de n'importe quelle touche du clavier logiciel. Je ne veux pas de EditView ou TextView dans mon activité, l'événement doit être géré à partir d'une vue étendue à l'intérieur de mon activité.

Je viens d'essayer ceci:

1) Ignorez la méthode onKeyUp(int keyCode, KeyEvent event) Activity. Cela ne fonctionne pas avec softkeybord, il attrape juste quelques touches.

2) Créer ma OnKeyListener et enregistrer celle qui contient une OnTouchListener enregistrée et active dans ma vue. Cela ne fonctionne pas du tout avec softkeyboar.

3) Remplacez la méthode onKeyUp(int keyCode, KeyEvent event) View. Cela ne fonctionne pas du tout si je règle mon OnKeyListener ni si je ne le configure pas.

4) Avec l'objet InputMethodManager Appelez la méthode showSoftInput et transmettez-lui ma vue. Cela ne fonctionne pas non plus pour relancer le clavier, en effet je dois appeler toggleSoftInput; ni pour attraper les événements clés.

J'ai tout testé uniquement dans l'émulateur mais je pense que ça suffit. Pourquoi est-ce si compliqué de prendre un simple événement de clavier depuis un clavier? 

24
Bemipefe

Essayez d’utiliser dispatchKeyEvent(KeyEvent event) dans votre Activity

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    Log.i("key pressed", String.valueOf(event.getKeyCode()));
    return super.dispatchKeyEvent(event);
}
35
vasart

Avec la touche vasart je peux obtenir l’événement KeyPress. Pour rendre le code d'activation imprimable, j'ai utilisé la fonction getUnicodeChar en lui passant l'état du bouton méta, puis simplement une conversion de caractères résolvant le problème.

C'est le code de travail :

@Override
public boolean dispatchKeyEvent(KeyEvent KEvent) 
{
    int keyaction = KEvent.getAction();

    if(keyaction == KeyEvent.ACTION_DOWN)
    {
        int keycode = KEvent.getKeyCode();
        int keyunicode = KEvent.getUnicodeChar(KEvent.getMetaState() );
        char character = (char) keyunicode;

        System.out.println("DEBUG MESSAGE KEY=" + character + " KEYCODE=" +  keycode);
    }


    return super.dispatchKeyEvent(KEvent);
}

Bien sûr, cela ne fonctionne qu'avec le caractère ASCII.

14
Bemipefe

Il n’existe aucune option permettant de gérer les événements de frappe sur un clavier virtuel (un clavier à l’écran) uniquement à partir d’un clavier matériel.

pour plus de détails: Gestion des actions au clavier

1
phnmnn

Lorsque le clavier est ouvert en activité, votre activité devient réellement au premier plan .......... Tous les TextArea ou TextField ont leur propre mécanisme permettant de faire entrer le clavier à l'écran à l'aide du clavier à l'écran ... Assurez-vous que vous définissez dans le fichier AndroidManifest sous votre activité Android: windowSoftInputMode = "stateAlwaysVisible", puis onkeyDown () fonctionnera et fonctionnera pour moi ...

0
Danish