Domanda

Vorrei creare un'applicazione di acquisizione foto / video.

Ho creato una classe CaptureView che si estende SurfaceView e lo mise nella maschera principale.

L'attività del modulo principale ha metodo onCreateOptionsMenu() che crea un menu. Il menu ha funzionato benissimo ma poi ho cercato di implementare un metodo 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);
}

Il menu non compare più e il metodo non prende onKeyDown evento.

Qualcuno sa quello che potrebbe essere la ragione di questo problema?

È stato utile?

Soluzione

ho scoperto che stavo tornando true per tutti gli eventi, dove dovrei solo sono tornati per il codice che stavo usando. Ho spostato il ritorno vero all'interno del campo di applicazione della if dichiarazione e tornai false altrimenti Che ha portato indietro il mio menu!

@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;
}

Altri suggerimenti

Ho avuto un problema simile e risolto con l'aggiunta di

this.requestFocus();
this.setFocusableInTouchMode(true);

nel costruttore della mia SurfaceView sottoclasse.

ho risolto rimuovendo l'istruzione if, in questo modo:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    switch(keyCode)
    {
        case KeyEvent.KEYCODE_CAMERA:
            videoPreview.TakePicture();
            return true;
    }
    return super.onKeyDown(keyCode, event);
}

Non so perché a volte non funziona, anche se per una delle mie applicazioni questo keyDown() sta lavorando bene e di nuovo quando lo uso per una nuova applicazione, allora non funziona.

Ma ho una soluzione che funziona sempre:

@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;
}

Ho risolto questo con l'aggiunta nel costruttore di questo codice:

setFocusable(true);
requestFocus();

grazie, Ciryon

Inoltre ogni volta che uso setContentView(myView); devo chiamare myView.requestFocus();. Se c'è una soluzione migliore la prego di dirmi.

Bene, nel guardare la documentazione API l'unica cosa che spicca è che l'androide: cliccabile attributo deve essere impostato come pure la vista viene abilitato per il metodo onKeyDown (...) a lavorare

.

si può provare questo

this.setFocusable(true);

Il tuo attività potrebbe essere mangiare l'evento chiave. Override onKeyDown nell'attività e gettare un punto di interruzione in là.

Inoltre: quando dici che hai "messo in forma principale" stai usando il layout XML o fare nel codice

?
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top