10

バックキーを押す機能をオーバーライドしようとしています。ユーザーが一度押すと、前の画面に戻りたいです。ただし、戻るキーが長押しされた場合 (たとえば、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繰り返し数/ミリ秒を使用して検出する必要がありますか?

4

3 に答える 3

17

が呼び出されない理由onKeyLongPressは、これが長押しである可能性があることをフレームワークに通知せずに true を返しonKeyDown、KeyEvent がさまざまなイベント ハンドラーを介してフローを停止するためです。

あなたがする必要があるのはこれです:

  1. true を返す前に、ドキュメント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 );
  }
于 2011-11-22T12:33:24.707 に答える
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);
}
于 2013-03-26T22:27:20.757 に答える
2

onKeyUp()と同様に使用してみませんonKeyDown()か? キーが押されるとすぐに呼び出され、ユーザーがキーをどれだけ長く押し続けるonKeyDown()かがわからないため、長押しかどうかはわかりません。startTrackingKasperMoerch が正しく言っているように、onKeyDown()メソッドを呼び出して を返す必要がありますtrue。次に、onKeyUp()呼び出しevent.isTracking()て、event.isLongPress()物事を長押しまたは短押しとして処理するかどうかを決定できます。

于 2011-11-22T12:48:53.630 に答える