2011-11-22 70 views
7

私はバックキーの機能を無効にしようとしています。ユーザーが一度押すと、前の画面に戻ります。しかし、バックキーを長押しすると(2秒以上)、アプリケーションを終了します。今では長押しと通常押しの区別は?

は、私は私の活動にこれらの2つのメソッドをオーバーライドしている:

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

しかしがonKeyLongPressコールバックが呼び出されることはありません、イベントは常にonKeyDown方法で受信されるので。

両方の方法を使用する方法はありますか?または、それをすべてonKeyDownで行い、それを検出するために繰り返し数/ミリ秒数を使用しますか?

+0

干し草このリンク[KeyEventのドキュメント](http://developer.android.com/reference/android/view/KeyEvent.Callback.html#onKeyDown%28int,%20androidをご確認ください。 view.KeyEvent%29) –

答えて

12

onKeyLongPressが呼び出されない理由は、onKeyDownでtrueを返します。これは、これが長いプレスである可能性があることをフレームワークに伝えずに、KeyEventがさまざまなイベントハンドラを通るフローを停止させます。あなたがする必要がどのような

はこれです:あなたが真を返す前に

  1. documentationで説明したように、event.startTracking()を呼び出します。
  2. 長押しをonKeyLongPressで処理します。

次のように実装し、それが動作します:

@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); 
    } 
+0

問題は、trueを返す前に、イベントが通常のプレスまたは長いプレスの場合は全く異なることがいくつかあります。ですから、どのような場合でも、 'startTracking'を呼び出す前に、' onKeyDown'メソッドの長時間の押下を検出する必要がありますか? –

+0

私は自分のコード内のコメントを編集して、私の意図を示しました。 keypressが短い場合、 'onKeyDown'でtrueを返すだけです。それ以外の場合は、長いkeypressハンドラに伝播します。 –

+0

必要な機能を提供するために私の答えを編集しました。 – kaspermoerch

2

onKeyUp()などonKeyDown()を使用しないのはなぜ? onKeyDown()の間は、キーが押されるとすぐに呼び出され、ユーザーがキーを押さえようとしている期間を知らないので、長押しかどうかはわかりません。 KasperMoerchが正しく言うように、onKeyDown()メソッドでstartTrackingに電話し、trueを返す必要があります。次にonKeyUp()event.isTracking()event.isLongPress()と電話をかけて、長押しまたは短押しとして処理するかどうかを判断できます。

+0

動作しません。'isTracking'はtrueを返しますが、私はほぼ5秒間ボタンを押したにもかかわらず、' isLongPress'はfalseを返します。これはシミュレータでテストできないのでしょうか? –

2

私はそれを処理する最善の方法はそうだと思います。

私がここで見ることができる唯一の欠点は、メニューボタンを1回クリックするだけで、ユーザーが有効になっている場合に音が出ないことです。おそらく、この設定をチェックして使用する方法、またはデフォルトの動作を呼び出す方法があります。

コード:

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); 
} 
関連する問題