Frage

Ich möchte ein Foto / Video-Capture-Anwendung erstellen.

Ich habe eine CaptureView Klasse geschaffen, die SurfaceView und legte sie in der Hauptform erstreckt.

Die Tätigkeit der Hauptform hat onCreateOptionsMenu() Methode, die ein Menü erstellt. Das Menü hat gut funktioniert, aber dann habe ich versucht, ein Verfahren onKeyDown zu implementieren:

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

Das Menü erscheint nicht mehr, und das Verfahren Ereignis nicht fangen onKeyDown.

Wer weiß, was der Grund für dieses Problem sein könnte?

War es hilfreich?

Lösung

Ich fand, dass ich zurückkehre true für alle Veranstaltungen, wo ich nur Rückkehr haben sollte es für den Code, den ich benutze. Ich zog die Rückkehr wahr innerhalb des Umfangs der if Erklärung und zurück false sonst Das brachte mein Menü zurück!

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

Andere Tipps

Ich hatte ein ähnliches Problem und löste es durch das Hinzufügen

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

im Konstruktor meiner Surfaceunterklasse.

i löste die if-Anweisung zu entfernen, wie folgt aus:

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

Ich weiß nicht, warum manchmal funktioniert es nicht, wenn auch für einen meiner apps diese keyDown() funktioniert prima und wieder, wenn ich es für eine neue App verwenden dann funktioniert es nicht.

Aber ich habe eine Lösung, die funktioniert immer:

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

Ich löste dies, indem in Konstruktor diesen Code:

setFocusable(true);
requestFocus();

Danke, Ciryon

Auch jedes Mal, wenn ich setContentView(myView); verwende ich myView.requestFocus(); nennen muss. Wenn es eine bessere Lösung ist mir bitte sagen.

Nun, in der API-Dokumentation ist in der Suche das einzige, was auffällt, dass die Android-Version: anklickbare Attribut muss sowie die Aussicht für die onKeyDown (...) Methode aktiviert werden eingestellt werden, um Arbeit

.

Sie können versuchen, diese

this.setFocusable(true);

könnte Ihre Aktivität sein, das Schlüsselereignis zu essen. Außer Kraft setzen onKeyDown der Aktivität und werfen Sie einen Haltepunkt in dort.

Auch: Wenn Sie sagen, Sie haben „platziert es in dem Hauptformular“ verwenden Sie das XML-Layout oder in Ihrem Code zu tun

?
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top