2010-11-21 3 views
38

Я пытаюсь обнаружить, когда нажата кнопка физического меню на моем телефоне Android. Я, хотя код ниже работал, но это не так. Где я ошибаюсь, пожалуйста?Обнаружение нажатия клавиши физического меню в Android

Возвращенная ошибка: «Недействительный модификатор для параметра onKeyDown; только окончательный разрешаются»

public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_MENU) { 
     // Do Stuff 
    } else { 
     return super.onKeyDown(keyCode, event); 
    } 
} 
+4

Было бы здорово, если бы вы смогли принять ответ, так как на этот вопрос сейчас полностью ответили. – SK9

ответ

0

Если вы сделали обрабатывать событие просто возвращает истину, если вы не вернулись ложными, так что Android система может передать событие остальных компонентов справиться с этим.

79

Я бы искать до ключевого события, а не события вниз с onKeyUp.

public boolean onKeyUp(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_MENU) { 
     // ........ 
     return true; 
    } 
    return super.onKeyUp(keyCode, event); 
} 

Мы возвращаем true, потому что мы обрабатываем событие; return false, если вы хотите, чтобы система также обрабатывала событие.

Вы можете сделать все это в своем примере Activity, так как Activity является известным непрямым подклассом KeyEvent.

+0

Также ознакомьтесь с документами [KeyEvent.Callback] (http://developer.android.com/reference/android/view/KeyEvent.Callback.html), и вот [пример] (http: // developer. android.com/training/keyboard-input/commands.html) –

+0

Его неправильный ответ он никогда не работает. См. Ниже ответ. –

+0

Работала для меня как шарм. Я был настроен скептически, потому что сначала я попытался выполнить onKeyDown(), и это событие для кнопки меню никогда не стекало к моей активности, оно было где-то поглощено на панели инструментов «действие». – gregko

12

Исходя из всего вышесказанного, это правильная реализация, которая будет потреблять только клавиши меню «вверх» и передавать другие ключевые события в суперкласс.

public boolean onKeyUp(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_MENU) { 
     // ... 
     return true; 
    } else { 
     return super.onKeyUp(keyCode, event); 
    } 
} 
+0

Это должно суммировать все это, вернуть true else call super class. –

6
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    //Checking for the "menu" key 
    if (keyCode == KeyEvent.KEYCODE_MENU) { 
     if (mDrawerLayout.isDrawerOpen(mDrawerList)) { 
      mDrawerLayout.closeDrawers(); 
     } else { 
      mDrawerLayout.openDrawer(Gravity.RIGHT); 
     } 
     return true; 
    } else { 
     return super.onKeyDown(keyCode, event); 
    } 
} 
+3

лучше дать объяснение вашего кода. – Raptor

+0

Я искал этот точный код :) Скрытие и отображение левого навигационного ящика. Благодарю. –

0

Убедитесь, что вы переопределить метод OnKeyDown в классе Activity. В классе View есть еще один метод onKeyDown, но он не будет вызываться, если нажата клавиша меню.

-3

У меня очень крутой ответ на этот вопрос :) Я пробовал за последний год, и я только что нашел решение за 3 дня до этого. Пожалуйста, посмотрите на ответ. Вам нужно сделать седативный класс для просмотра. Точно используйте приведенный ниже код с именем HomeWatcher.

public class HomeWatcher { 
    static final String TAG = "HomeWatcher"; 
    private Context mContext; 
    private IntentFilter mFilter; 
    private OnHomePressedListener mListener; 
    private InnerRecevier mRecevier; 

    public interface OnHomePressedListener { 
     public void onHomePressed(); 

     public void onHomeLongPressed(); 

     //public void onLockLongPressed(); 
    } 

    public HomeWatcher(Context context) { 
     mContext = context; 
     mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 
    } 


    public void setOnHomePressedListener(OnHomePressedListener listener) { 
     mListener = listener; 
     mRecevier = new InnerRecevier(); 
    } 

    public void startWatch() { 
     try{ 
     if (mRecevier != null) { 
      mContext.registerReceiver(mRecevier, mFilter); 
     } 
     }catch(Exception e){} 
    } 


    public void stopWatch() { 
     try{ 
     if (mRecevier != null) { 
      mContext.unregisterReceiver(mRecevier); 
     } 
     }catch(Exception e){} 
    } 


    class InnerRecevier extends BroadcastReceiver { 
     final String SYSTEM_DIALOG_REASON_KEY = "reason"; 
     final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions"; 
     final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps"; 
     final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey"; 
     //final String SYSTEM_DIALOG_REASON_Lock = "lock"; 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 
      if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { 
       String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY); 

       if (reason != null) { 
        Log.e(TAG, "action:" + action + ",reason:" + reason); 
        if (mListener != null) { 
         if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) { 
          mListener.onHomePressed(); 
         } else if (reason 
           .equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) { 
          mListener.onHomeLongPressed(); 

         } 
        /* else if (reason 
           .equals(SYSTEM_DIALOG_REASON_Lock)) { 
          mListener.onLockLongPressed(); 

         }*/ 

        } 
       } 
      } 
     } 
    } 
} 

После того как сделан класс HomeWatcher. Вам нужно объявить Homewatcher в своем желаемом классе, где вы хотите обнаружить кнопку «Дом» и кнопку «Последние приложения».

public class MainActivity extends Activity { 

    private HomeWatcher mHomeWatcher; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 
    try { 

      mHomeWatcher = new HomeWatcher(this); 
      mHomeWatcher.setOnHomePressedListener(new OnHomePressedListener() { 
       @Override 
       public void onHomePressed() { 
        Log.e(TAG, "onHomePressed"); 


       } 
       @Override 
       public void onHomeLongPressed() { 
        Log.e(TAG, "recent apps"); 

       } 


      }); 
      mHomeWatcher.startWatch(); 
     } catch (Exception e) { 
     } 

    } 

В конце этого вам просто нужно добавить метод OnPause и onResume Overide как это.

@Override 
    protected void onResume() { 
     super.onResume(); 

     try { 
      mHomeWatcher.startWatch(); 

     } catch (Exception e) { 
     } 
    } 
    @Override 
    protected void onPause() { 
     super.onPause(); 

     try { 
      mHomeWatcher.stopWatch(); 

     } catch (Exception e) { 
     } 
} 

Очень простой и красивый ответ. Ожидание голосов и принятого ответа: p

Смежные вопросы