Wie man unterscheidet zwischen lang - - Taste drücken und regelmäßige Taste drücken?
Ich versuche zu überschreiben, die Funktionalität des zurück-Taste drücken. Drückt der Benutzer es einmal, ich will es wieder zum vorherigen Bildschirm. Allerdings, wenn die zurück-Taste lange gedrückt (für, sagen wir, zwei Sekunden oder mehr), möchte ich die Anwendung zu beenden.
Inzwischen habe ich überschrieben, diese beiden Methoden in meine Tätigkeit:
@Override
public boolean onKeyDown( int keyCode, KeyEvent event){
if (keyCode == KeyEvent.KEYCODE_BACK) {
//manage short keypress
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyLongPress( int keyCode, KeyEvent event){
if (keyCode == KeyEvent.KEYCODE_BACK) {
//manage long keypress (different code than short one)
return true;
}
return super.onKeyLongPress(keyCode, event);
}
Aber die onKeyLongPress
Rückruf wird nicht aufgerufen, denn die Veranstaltung ist immer erhalten, indem die onKeyDown
Methode.
Gibt es eine Möglichkeit, dass beide Methoden arbeiten? Oder hat es alles getan, was in der onKeyDown
und die Anzahl der Wiederholungen/Millisekunden zu detektieren?
- hay check this link, keyevent doc
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Grund, warum
onKeyLongPress
ist nie genannt wird, ist, dass Sie true zurück, inonKeyDown
ohne Rahmen, dass dies vielleicht lange drücken - wodurch das KeyEvent zu verhindern, dass der Fluss durch die verschiedenen event-Handlern.Was Sie tun müssen, ist dieses:
event.startTracking()
wie in der Dokumentation.onKeyLongPress
.Implementieren, wie unten und es wird funktionieren:
onKeyDown
- Methode vor dem AufrufstartTracking
, ist es nicht?onKeyDown
wenn der Tastendruck ist kurz. Sonst verbreiten zu lange keypress-Ereignishandler.Warum nicht
onKeyUp()
sowieonKeyDown()
? WährendonKeyDown()
Sie nicht wissen, ob es ein-Taste lange drücken oder nicht, denn die wird aufgerufen, sobald die Taste gedrückt ist und Sie nicht wissen, wie lange der Benutzer beabsichtigt, halten Sie die Taste gedrückt für. Als KasperMoerch richtig sagt, müssen Sie rufen SiestartTracking
in IhremonKeyDown()
Methode, und zurücktrue
. Dann in IhreonKeyUp()
können Sie anrufenevent.isTracking()
undevent.isLongPress()
um zu bestimmen, ob die Dinge handhaben als lang drücken oder kurz drücken.isTracking
gibt true zurück, aberisLongPress
gibt false zurück, obwohl ich hielt den Knopf für fast 5 Sekunden. Vielleicht kann dies nicht getestet werden-simulator?Ich denke, der beste Weg, es zu handhaben ist als solche.
Der einzige Nachteil den ich hier sehen kann, ist, dass ein einfacher Klick auf die Menü-Taste macht keinen Ton, wenn der Benutzer Sie aktiviert hat. Vielleicht gibt es einen Weg um diese Einstellung zu überprüfen, und verwenden Sie es, oder rufen Sie die Standard-Verhalten.
Code: