Android - переопределить меню долгое нажатие, чтобы вызвать домашний экран приложения и обычное нажатие, чтобы вызвать меню - PullRequest
2 голосов
/ 03 июня 2011

Я пытаюсь получить ключ меню, чтобы вызвать следующее:

  1. При длительном нажатии вывести домашний экран моего приложения (вместо программной клавиатуры по умолчанию)
  2. При обычном нажатии вызвать меню.

Я могу сделать одно или оба, но не оба. Что мне не хватает? Некоторый код будет высоко ценится.

Спасибо

Вот что у меня есть:

  @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)  
    {   
     if (keyCode == KeyEvent.KEYCODE_MENU) 
     {
      event.startTracking();
      return true;
     }

 return super.onKeyDown(keyCode, event);
}

@Override
public boolean onKeyUp(int keyCode, KeyEvent event)
{
   if (keyCode == KeyEvent.KEYCODE_MENU && event.isTracking() && !event.isCanceled())
   {
      this.openOptionsMenu();
   }
   return super.onKeyUp(keyCode,event);
}


 @Override
    public boolean onKeyLongPress(int keyCode, KeyEvent event)
    {
        if (keyCode == KeyEvent.KEYCODE_MENU){

            if ( _activityId != WndId.Home)
            {
                navigateHome(NavDirection.Up);
                return (true);
            }
        }
        return super.onKeyLongPress(keyCode,event);
    }
@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.muve_menu, menu);
        return true;
    }

Ответы [ 2 ]

1 голос
/ 04 июня 2011

Так что если вы вызываете this.openOptionsMenu (); в onKeyUp () вы получаете меню, отображаемое на обычном экране, а софт-клавиатура переопределяется перенаправлением на домашний экран.

0 голосов
/ 03 июня 2011

Я подозреваю, что когда вы говорите, что «можете сделать одно или оба, но не то и другое», вы имеете в виду, что если вы переопределите onKeyUp, вы не увидите onKeyLongPress? Если так, то это потому, что ключевые события долгого нажатия также проходят через onKeyUp (возможно, до того, как они попадут в onKeyLongPress), и вы возвращаете true, чтобы сказать, что ваш код обработал его - следовательно, он никогда не попадет в onKeyLongPress.

В документах сказано, что

"Каждое нажатие клавиши описывается последовательностью событий клавиши. Нажатие клавиши начинается с события клавиши с ACTION_DOWN. Если клавиша удерживается достаточно долго, чтобы она повторялась, то после начального нажатия следуют дополнительные события клавиши с ACTION_DOWN и ненулевое значение для getRepeatCount (). Последнее ключевое событие - это ACTION_UP для повышения ключа. "

Поэтому, если вы хотите различать короткое нажатие меню и длинное нажатие меню, вам также придется отслеживать onKeyDown и различать несколько ACTION_DOWN.

...