2012-07-22 2 views
1

J'essaie de remplacer les boutons de volume pour agir en tant que touches fléchées haut/bas (c'est-à-dire qu'elles doivent se déplacer sur toutes mes activités.)comment usurper les touches fléchées de mon activité sur android

Pour ce faire, je remplace mes activités dispatchKeyEvent() méthode note que j'ai également essayé onKeyDown() mais une partie de mes événements de touches de volume était encore en cours au système, mon appareil a un retour sonore lorsque vous modifiez le volume. Je pouvais encore entendre le bip mais le volume n'était pas réellement changé. Le passage au dispatchKeyEvent() a supprimé le bip provenant du système.

Voici ma méthode actuelle dispatchKeyEvent():

@Override 
public boolean dispatchKeyEvent(KeyEvent ke){ 
    int keyCode = ke.getKeyCode(); 
    if(ke.getAction() == KeyEvent.ACTION_DOWN){ 
     print("press " + keyCode); 
     if(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) 
     { 
      mTxt.postDelayed(pressDown, 600); 
      return true; 
     }else if(keyCode == KeyEvent.KEYCODE_VOLUME_UP) 
     { 
      KeyEvent key = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_UP); 
      dispatchKeyEvent(key); 
      return true; 
     } 
    }else if(ke.getAction() == KeyEvent.ACTION_UP){ 
     print("release " + keyCode); 
     if(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) 
     { 
      /*KeyEvent keyUp = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_DOWN); 
      dispatchKeyEvent(keyUp);*/ 
      return true; 
     }else if(keyCode == KeyEvent.KEYCODE_VOLUME_UP) 
     { 
      KeyEvent keyUp = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_UP); 
      dispatchKeyEvent(keyUp); 
      return true; 
     } 
    } 
    return super.dispatchKeyEvent(ke); 
} 

la façon dont il est mis en place maintenant, il utilise différentes techniques pour haut et en bas, mais ne fonctionnent correctement pour changer le focus. Pour la touche Haut, je fais simplement un appel manuel à dispatchKeyEvent() en lui passant la clé d-pad up et la même action que le bouton de volume (donc quand j'appuie dessus, il faut appuyer sur, et quand je relâche je relâche) ma sortie bouton vers le haut ressemble à ceci:

press 24 
press 19 
release 24 
release 19 

pour le bouton vers le bas je pincé légèrement parce que je pensais peut-être le fait que la presse dpad se passait avant la sortie du volume rompait, donc je fait une runnable qui sera à la fois appuyer et relâcher le bouton dpad

pressDown = new Runnable(){ 
     @Override 
     public void run(){ 
      KeyEvent key = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_DOWN); 
      dispatchKeyEvent(key); 
      KeyEvent keyUp = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_DOWN); 
      dispatchKeyEvent(keyUp); 
     } 
    }; 

et je retarder que par une partie d'une seconde pour que j'ai une chance de libérer le volum e. Ma sortie du bouton de ressemble à ceci:

press 25 
release 25 
press 20 
release 20 

si je branche un clavier USB sur mon appareil et appuyez sur les touches fléchées le focus se déplace correctement et je vois la sortie jusqu'à:

press 19 
release 19 

et vers le bas:

press 20 
release 20 

la seule différence (pour autant que je peux dire) est que le focus se déplace effectivement correctement lorsque j'appuie sur les flèches de mon clavier, et ne bouge pas du tout quand je presse la vo boutons de lume (qui usurpent les boutons fléchés)

Est-ce que je regarde quelque chose ici? Quelqu'un peut-il m'aider à comprendre comment usurper les touches fléchées de mon activité afin qu'elles puissent réellement se déplacer correctement?

Répondre

2

J'ai finalement découvert que vous deviez utiliser la classe Instrumentation pour envoyer les événements clés, et vous devez le faire hors du thread principal pour une raison quelconque. Voici les extraits qui envoient vers le bas et vers le haut:

new Thread(new Runnable() {   
    @Override 
    public void run() {     
     new Instrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_DOWN); 
    } 
}).start(); 

new Thread(new Runnable() {   
    @Override 
    public void run() {     
     new Instrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_UP); 
    } 
}).start(); 

Si vous utilisez ces insdie la dispatchKeyEvent surchargée de la question, il sera correctement déplacer le focus autour.

Questions connexes