Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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.

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?

  • OnKeyListener no funciona en el teclado virtual
  • Actividad de fragmento catch onKeyDown y uso en fragmento
  • Llamar a funciones javascript en una vista web desde la clase de actividad
  • Soft teclado sin EditText y la detección de pulsaciones de teclas
  • AutoCompleteTextView detecta cuando se selecciona la entrada de la lista editada por el usuario
  • El cuadro de diálogo se muestra dos veces cuando se pulsa de nuevo
  • Fake KeyEvent no funciona * exactamente * como el botón "real". ¿Por qué?
  • 8 Solutions collect form web for “Problema onKeyDown ()”

    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?

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.