onKeyDown () Ausgabe
-
13-09-2019 - |
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?
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
?