question onKeyDown ()
-
13-09-2019 - |
Question
Je voudrais créer une application de capture photo / vidéo.
I ai créé une classe de CaptureView
qui se prolonge SurfaceView
et placé sous la forme principale.
L'activité de la principale forme a méthode onCreateOptionsMenu()
qui crée un menu. Le menu a bien fonctionné mais j'ai essayé de mettre en œuvre une méthode onKeyDown
:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(event.getAction() == KeyEvent.ACTION_DOWN) {
switch(keyCode) {
case KeyEvent.KEYCODE_CAMERA:
videoPreview.TakePicture();
return true;
}
}
return super.onKeyDown(keyCode, event);
}
Le menu ne semble pas plus et la méthode ne capture pas onKeyDown événement.
Quelqu'un sait-il ce qui pourrait être la raison de ce problème?
La solution
Je trouve que je rentrais true
pour tous les événements, où je ne suis RETOURNANT pour le code que j'utilisais. Je me suis déplacé le retour vrai à l'intérieur du cadre de la if
déclaration et retour false
sinon Cela a apporté mon menu retour!
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
super.onKeyDown(keyCode, event);
if (keyCode == KeyEvent.KEYCODE_BACK) {
dba.close();
Intent result = new Intent("Complete");
setResult(Activity.RESULT_OK, result);
finish();
return true;
}
return false;
}
Autres conseils
J'ai eu un problème similaire et résolu en ajoutant
this.requestFocus();
this.setFocusableInTouchMode(true);
dans le constructeur de ma sous-classe SurfaceView.
i résolu la suppression de l'instruction if, comme ceci:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch(keyCode)
{
case KeyEvent.KEYCODE_CAMERA:
videoPreview.TakePicture();
return true;
}
return super.onKeyDown(keyCode, event);
}
Je ne sais pas pourquoi parfois ça ne marche pas, mais pour une de mes applications ce keyDown()
fonctionne bien et encore quand je l'utilise pour une nouvelle application il ne fonctionne pas.
Mais j'ai une solution qui fonctionne toujours:
@Override
public boolean dispatchKeyEvent (KeyEvent event) {
if (event.getAction()==KeyEvent.ACTION_DOWN && event.getKeyCode()==KeyEvent.KEYCODE_BACK) {
Toast.makeText(this, "Back button pressed", Toast.LENGTH_LONG).show();
return true;
}
return false;
}
I résolu ce problème en ajoutant en constructeur de ce code:
setFocusable(true);
requestFocus();
merci, Ciryon
Aussi chaque fois que je l'utilise setContentView(myView);
je dois appeler myView.requestFocus();
. S'il y a une meilleure solution s'il vous plaît me dire.
Eh bien, en regardant la documentation de l'API la seule chose qui se démarque est que l'androïde: cliquable attribut doit être aussi bien que la vue étant activé pour la méthode onKeyDown (...) pour travailler
.vous pouvez essayer
this.setFocusable(true);
Votre activité pourrait être manger l'événement clé. Remplacer onKeyDown dans l'activité et jeter un point d'arrêt là-dedans.
Aussi: quand vous dites que vous avez « placé sous la forme principale » vous utilisez la mise en page XML ou faire dans votre code
?