2012-03-29 4 views
6

Bei der Suche nach wichtigen Ereignissen in ActionBarSherlock, um das Überlaufmenü auf Pre-ICS-Geräten zu zeigen, bin ich mit einem interessanten Problem konfrontiert. Es scheint, dass ich nicht in der Lage bin, einen einfachen Tastendruck zu unterscheiden, wenn der Benutzer die Menütaste lange drückt, um den IME anzuzeigen. Beide KeyEvent Instanzen sind genau die gleichen und wie folgt aussehen:Normale Menü KeyEvent von IME-Eröffnung unterscheiden

Gibt es eine einfache Möglichkeit, zwischen diesen zwei verschiedene Ereignisse zu unterscheiden?

+0

Die Verwendung des 'onPrepareOptionsMenu'-Callbacks ist mein Fallback, aber ich würde es lieber über wichtige Ereignisse behandeln. –

Antwort

3

Hmmmm ... onLongKeyPress() scheint nicht mit KEYCODE_MENU zu arbeiten. Wie nervig.

Dies scheint auf dem Nexus S (4.0.3) und Nexus One (2.3.6) zu arbeiten:

public class MenuKeyDetectorActivity extends Activity { 
    boolean wasLongPress=false; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    } 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_MENU) { 
     wasLongPress=wasLongPress | event.isLongPress(); 
    } 

    return(false); 
    } 

    @Override 
    public boolean onKeyUp(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_MENU) { 
     Log.w("MKD", String.format("wasLongPress: %b", wasLongPress)); 
     wasLongPress=false; 
    } 

    return(false); 
    } 
} 

Grundsätzlich ist zu beachten, ob es sich um eine lange drücken oder nicht in Ihrem onKeyDown() Anrufe, Verwenden Sie dann diese Informationen in onKeyUp(), um die endgültige Disposition zu bestimmen.

+0

In der Hoffnung, dass diese Technik mit 'onKeyEvent' funktioniert und die Auf-/Ab-Aktion erkennt. Ich verstehe nicht, warum das nicht so wäre. Vielen Dank! –