Wie unterscheide ich zwischen dem langen Tastendruck und dem regulären Tastendruck?

Ich versuche, die Funktionalität der Rücktaste zu überschreiben. Wenn der Benutzer es einmal drückt, möchte ich, dass es wieder zum vorherigen Bildschirm kommt. Allerdings, wenn die Rücktaste lang gedrückt ist (für, sagen wir mal zwei Sekunden oder mehr), möchte ich die Anwendung beenden.

Mittlerweile habe ich diese beiden Methoden in meiner Tätigkeit überschrieben:

  • Hintergrundbild Dimension für Navigation Schubladenkopf
  • Benennen Sie eine Datei im internen Speicher um
  • Was ist orderInCategory in ActionBar Menüpunkt & warum ist es für ..?
  • Kann ich eine versteckte (aber öffentliche) Methode überschreiben und ihre Super-Methode anrufen?
  • Speichern von Android-Anwendungsdaten auf SD-Karte
  • Android veraltete Apache-Modul (HttpClient, HttpResponse, etc.)
  • @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 der onKeyLongPress Rückruf wird niemals aufgerufen, da das Event immer von der onKeyDown Methode onKeyDown wird.

    Gibt es eine Möglichkeit, beide Methoden zu arbeiten? Oder muss man alles im onKeyDown und die Anzahl der Wiederholungen / Millisekunden verwenden, um es zu erkennen?

  • Welche Ansicht sollte für die neue Material Design Bottom Navigation verwendet werden?
  • Horizontale Scroll-Ansicht: Ist es wirklich eine Lösung?
  • Proguard-Fehler beim Generieren von Secure Signed APK
  • Programmgesteuert starten / starten VPN-Verbindung
  • Zip / komprimieren einen Ordner voller Dateien auf Android
  • Libgdx-android: Abfangen der Rücktaste und bestätigen den Ausstieg
  • 3 Solutions collect form web for “Wie unterscheide ich zwischen dem langen Tastendruck und dem regulären Tastendruck?”

    Der Grund, warum onKeyLongPress niemals angerufen wird, ist, dass du in onKeyDown wahr onKeyDown ohne dem Framework zu sagen, dass dies ein langer Druck sein könnte, was dazu führt, dass der KeyEvent seinen Fluss durch die verschiedenen Event-Handler stoppt.

    Was Sie tun müssen, ist das:

    1. Bevor Sie wahr werden, rufen Sie event.startTracking() wie in der Dokumentation erläutert.
    2. onKeyLongPress die lange Presse in onKeyLongPress .

    Implementieren Sie als unten und es wird funktionieren:

      @Override public boolean onKeyDown( int keyCode, KeyEvent event ) { if( keyCode == KeyEvent.KEYCODE_BACK ) { event.startTracking(); return true; } return super.onKeyDown( keyCode, event ); } @Override public boolean onKeyUp( int keyCode, KeyEvent event ) { if( keyCode == KeyEvent.KEYCODE_BACK ) { //Handle what you want on short press. return true; } return super.onKeyUp( keyCode, event ); } @Override public boolean onKeyLongPress( int keyCode, KeyEvent event ) { if( keyCode == KeyEvent.KEYCODE_BACK ) { //Handle what you want in long press. return true; } return super.onKeyLongPress( keyCode, event ); } 

    Warum nicht onKeyUp() sowie onKeyDown() ? Während onKeyDown() weißt du nicht, ob es eine lange Presse ist oder nicht, denn das heißt, sobald die Taste gedrückt wird und du weißt nicht, wie lange der Benutzer beabsichtigt, den Schlüssel zu halten. Wie KasperMoerch richtig sagt, müssen Sie startTracking in Ihrer onKeyDown() Methode onKeyDown() und true . Dann können Sie in Ihrem onKeyUp() event.isTracking() und event.isLongPress() um festzustellen, ob die Dinge als langer Druck oder kurzer Druck zu behandeln sind.

    Ich denke, der beste Weg, um damit umzugehen ist als solche.

    Der einzige Nachteil, den ich hier sehen kann, ist, dass der einzelne Klick auf die Menütaste keinen Ton macht, falls der Benutzer es aktiviert hat. Vielleicht gibt es eine Möglichkeit, diese Einstellung zu überprüfen und zu verwenden oder das Standardverhalten aufzurufen.

    Code:

     private boolean _handledMenuButton=false; @Override public boolean onKeyUp(final int keyCode,final KeyEvent event) { switch(keyCode) { case KeyEvent.KEYCODE_MENU: if (!_handledMenuButton) { //Handle single clicking here } _handledMenuButton=false; return true; } return super.onKeyUp(keyCode,event); } @Override public boolean onKeyLongPress(final int keyCode, final KeyEvent event) { switch(keyCode) { case KeyEvent.KEYCODE_MENU: //Handle long clicking here _handledMenuButton=true; return true; } return super.onKeyLongPress(keyCode,event); } @Override public boolean onKeyDown(final int keyCode,final KeyEvent event) { switch(keyCode) { case KeyEvent.KEYCODE_MENU: _handledMenuButton=false; event.startTracking(); return true; } return super.onKeyDown(keyCode,event); } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.