2012-03-29 6 views
6

ICS前のデバイスにオーバーフローメニューを表示するために、ActionBarSherlockのキーイベントをリスニングする際に興味深い問題に直面しています。ユーザーがIMEを表示する意図でメニューキーを長押ししている場合と比べて、簡単なキープレスを区別することができないように見えます。どちらKeyEventインスタンスはまったく同じであり、次のようになります。Regular Menu KeyEventとIMEの開きを区別する

は、これらの二つの別個のイベントを区別する簡単な方法はありますか?

+0

'onPrepareOptionsMenu'コールバックを使用することは私の後退ですが、私はキーイベントを介してそれを処理することを好むでしょう。 –

答えて

3

Hmmmm ... onLongKeyPress()KEYCODE_MENUで動作しないようです。どのように迷惑。

これは、ネクサスS(4.0.3)とネクサスワン(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); 
    } 
} 

、それは長押しまたはないあなたのonKeyDown()の呼び出しであるかどうかに注意してください、 onKeyUp()にその情報を使用して最終的な処分を決定します。

+0

このテクニックを期待すると、 'onKeyEvent'と連動してup/downアクションを検出します。なぜそうでないのか分かりません。ありがとう! –

関連する問題