questão onkeydown ()
-
13-09-2019 - |
Pergunta
Eu gostaria de criar um aplicativo de captura de foto / vídeo.
Eu criei uma classe CaptureView
que se estende SurfaceView
e colocou-o no formulário principal.
A actividade do formulário principal tem método onCreateOptionsMenu()
que cria um menu. O menu funcionou bem, mas então eu tentei implementar um onKeyDown
método:
@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);
}
O menu não aparecer mais e o método não pega onKeyDown evento.
Alguém sabe o que poderia ser a razão para este problema?
Solução
eu descobri que eu estava retornando true
para todos os eventos, onde só deveria ter sido devolvê-lo para o código que eu estava usando. Mudei o return true dentro do âmbito do if
declaração e voltou false
caso contrário Isso trouxe meu menu de volta!
@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;
}
Outras dicas
Eu tive um problema semelhante e resolvido-lo adicionando
this.requestFocus();
this.setFocusableInTouchMode(true);
no construtor da minha SurfaceView subclasse.
i resolvido removendo a instrução if, como este:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch(keyCode)
{
case KeyEvent.KEYCODE_CAMERA:
videoPreview.TakePicture();
return true;
}
return super.onKeyDown(keyCode, event);
}
Eu não sei por que às vezes não funciona, embora para um dos meus apps esta keyDown()
está funcionando bem e novamente quando eu usá-lo para um novo aplicativo, em seguida, ele não funciona.
Mas eu tenho uma solução que sempre funciona:
@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;
}
Eu resolvi isso adicionando para o construtor este código:
setFocusable(true);
requestFocus();
graças, Ciryon
Também cada tempo de uso I setContentView(myView);
devo chamar myView.requestFocus();
. Se não houver uma solução melhor por favor me diga.
Bem, olhando para a documentação da API a única coisa que se destaca é que o android:. Atributo clickable deve ser definido, bem como o ser vista habilitado para o método onKeyDown (...) para o trabalho
Você pode tentar este
this.setFocusable(true);
Sua atividade poderia estar comendo o evento chave. Substituir onKeyDown na atividade e jogar um ponto de interrupção lá.
Além disso: quando você diz que "colocou-o no formulário principal" você está usando o layout XML ou fazer em seu código