Problema onKeyDown ()
Me gustaría crear una aplicación de captura de foto / video.
He creado una clase CaptureView
que extiende SurfaceView
y la coloco en el formulario principal.
- Android onkey - dispatchKeyEvent sin disparar
- AutoCompleteTextView detecta cuando se selecciona la entrada de la lista editada por el usuario
- Fake KeyEvent no funciona * exactamente * como el botón "real". ¿Por qué?
- Cómo utilizar diferentes onKeyDown en fragmento de una misma actividad
- Android: Cómo controlar el botón de inicio
La actividad del formulario principal tiene onCreateOptionsMenu()
método onCreateOptionsMenu()
que crea un menú. El menú funcionó bien, pero luego traté de implementar un método 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); }
El menú ya no aparece y el método no captura el evento onKeyDown.
¿Alguien sabe cuál podría ser la razón de este problema?
- El cuadro de diálogo se muestra dos veces cuando se pulsa de nuevo
- Llamar a funciones javascript en una vista web desde la clase de actividad
- Android: Cómo llamar a MediaController para avanzar y retroceder rápidamente usando KeyEvents
- Actividad de fragmento catch onKeyDown y uso en fragmento
- Anulación del botón de retroceso
- OnKeyListener no funciona en el teclado virtual
- Soft teclado sin EditText y la detección de pulsaciones de teclas
Descubrí que estaba devolviendo verdadero para todos los eventos, donde sólo debería haber sido devolverlo por el código que estaba usando. Me trasladé la vuelta verdad dentro del alcance de la 'si' y devuelto falso … Eso trajo mi menú de vuelta!
@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;** }
Tuve un problema similar y lo resolví agregando
this.requestFocus(); this.setFocusableInTouchMode(true);
En el constructor de mi subclase SurfaceView.
I resuelto la eliminación de la declaración 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); }
No sé por qué a veces no funciona, aunque para una de mis aplicaciones este keyDown()
está funcionando bien y de nuevo cuando lo uso para una nueva aplicación, entonces no funciona.
Pero tengo una solución que siempre 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; }
He resuelto esto añadiendo en constructor este código:
setFocusable(true); requestFocus();
Gracias, Ciryon
También cada vez que uso setContentView(myView);
Debo llamar a myView.requestFocus();
. Si hay una mejor solución por favor dígame.
Bueno, al mirar la documentación de la API lo único que destaca es que el atributo android: clickable se debe establecer así como la vista que está habilitada para que el método onKeyDown (…) funcione.
Puedes probar esto
this.setFocusable(true);
Su Actividad podría estar comiendo el evento clave. Anular onKeyDown en la actividad y lanzar un punto de interrupción en allí.
También: cuando dices que lo has "colocado en el formulario principal", ¿estás usando el diseño XML o haciendo en tu código?