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:

  • Verwirrt, wie man Mockito für einen Android-Test benutzt
  • Wie man Retrofit Client-Bibliothek aus wp Rest api mit Swagger zu generieren
  • Build Target und Min SDK Version in Android
  • Das Abrufen von Kontakten in Android ist sehr langsam
  • Android xxx-hdpi echte Geräte
  • Wie kann man die Spaltenposition im gestaffelten Rasterplan-Manager bestimmen
  • @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?

  • Testen von Datenbank auf Android: ProviderTestCase2 oder RenamingDelegatingContext?
  • Wie zu vermeiden, weiche Tastatur drückt mein Layout?
  • Ziehbarer Vorteil gegenüber Bitmap für Speicher in Android
  • Socket nicht trennen, wenn sich Konnektivität ändert
  • Ist es möglich, die Quelle (zB Google Play) von Android App zu kennen?
  • Fragment im Inneren des Fragments
  • 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.