7

ICS 以前のデバイスでオーバーフロー メニューを表示するために ActionBarSherlock でキー イベントをリッスンする際に、興味深い問題に直面しています。ユーザーがIMEを表示するためにメニューキーを長押ししているときと、単純なキーの押下を区別できないようです。どちらKeyEventのインスタンスもまったく同じで、次のようになります。

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

4

1 に答える 1

4

うーん...onLongKeyPress()では動作しないようですKEYCODE_MENU。面倒くさい。

これは Nexus S (4.0.3) と 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);
  }
}

onKeyDown()基本的には、通話で長押しかどうかに注意し、その情報を使用しonKeyUp()て最終的な処理を決定します。

于 2012-03-29T18:35:48.407 に答える