2012-03-29 18 views
6

Al escuchar eventos clave en ActionBarSherlock para mostrar el menú de desbordamiento en dispositivos pre-ICS y estoy enfrentando un problema interesante. Parece que no puedo diferenciar una simple pulsación de tecla frente a cuando el usuario está presionando largamente la tecla de menú con la intención de mostrar el IME. Ambos KeyEvent casos son exactamente los mismos y se ven así:Diferenciar menú regular KeyEvent from IME Opening

¿Hay una manera sencilla de diferenciar entre estos dos eventos distintos?

+0

Usar la devolución de llamada 'onPrepareOptionsMenu' es mi alternativa, pero preferiría manejarlo a través de eventos clave. –

Respuesta

3

Hmmmm ... onLongKeyPress() parece que no funciona con KEYCODE_MENU. Que molesto.

Esto parece funcionar en el Nexus S (4.0.3) y el Nexus One (2.3.6):

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); 
    } 
} 

Básicamente, tenga en cuenta si se trata de un largo prensa o no en sus onKeyDown() llamadas, luego use esa información en onKeyUp() para determinar la disposición final.

+0

Esperando que esta técnica funcione con 'onKeyEvent' y detectando la acción de subir/bajar. No veo por qué no lo haría. ¡Gracias! –