2010-11-21 16 views
38

Próbuję wykryć, kiedy fizyczny przycisk Menu na moim telefonie z Androidem został naciśnięty. Chociaż poniższy kod zadziała, ale nie działa. Gdzie się mylę, proszę?Wykrywanie fizycznego naciśnięcia klawisza menu w systemie Android

Zwrócony błąd to "Nielegalny modyfikator dla parametru onKeyDown; tylko końcowy jest dozwolone”

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

Byłoby wspaniale, gdybyś mógł zaakceptować odpowiedź, ponieważ na to pytanie jest już dokładnie udzielona odpowiedź. – SK9

Odpowiedz

0

Jeśli tak obsłużyć zdarzenie po prostu wrócić prawdziwe, jeśli nie zwróci false więc system Android może przekazać zdarzenia z resztą składników, aby je obsłużyć.

79

będę szukać się przypadku klucza, zamiast zdarzenia dół z onKeyUp.

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

Zwracamy true, ponieważ obsługujemy wydarzenie; return false, jeśli chcesz, aby system obsługiwał także wydarzenie.

Możesz to zrobić również w instancji Activity, ponieważ Activity jest znaną pośrednią podklasą KeyEvent.

+0

Zobacz również dokument [KeyEvent.Callback] (http://developer.android.com/reference/android/view/KeyEvent.Callback.html) i tutaj jest [przykład] (http: // developer. android.com/training/keyboard-input/commands.html) –

+0

To zła odpowiedź, że nigdy nie działa. Poniżej znajduje się odpowiedź. –

+0

Pracował dla mnie jak urok. Byłem sceptyczny, ponieważ najpierw próbowałem naKeyDown(), a to wydarzenie dla przycisku menu nigdy nie spłynęło do mojej aktywności, zostało pochłonięte gdzieś na pasku narzędzi "akcji". – gregko

12

W oparciu o powyższe wygląda na to, że jest to poprawna implementacja, która pochłonie tylko zdarzenia "up" w menu i przekaże innym kluczowym zdarzeniom nadklasę.

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

To powinno podsumować wszystko, zwrócić 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

lepiej jest podać wyjaśnienie swojego kodu. – Raptor

+0

Szukałem tego dokładnego kodu :) Ukrywanie i pokazywanie lewej szuflady nawigacyjnej. Dzięki. –

0

Upewnij się zastąpić metodę onKeyDown w klasie aktywny. Istnieje kolejna metoda onKeyDown w klasie Widok, ale nie będzie ona wywoływana po naciśnięciu klawisza menu.

-3

Mam bardzo fajną odpowiedź na to pytanie :) Próbowałem przez ostatni rok LOL i właśnie znalazłem rozwiązanie 3 dni wcześniej. Proszę spojrzeć na odpowiedź. Musisz zrobić Home watcher przegradzać klasy. Dokładnie użyj poniższego kodu z nazwą 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(); 

         }*/ 

        } 
       } 
      } 
     } 
    } 
} 

Po utworzeniu klasy HomeWatcher. Musisz zadeklarować program Homewatcher w wybranej klasie, w której chcesz wykryć przycisk Home i przycisk Ostatnie aplikacje.

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) { 
     } 

    } 

Pod koniec tego wystarczy dodać metodę onPause i onResume Overide w ten sposób.

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

     try { 
      mHomeWatcher.startWatch(); 

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

     try { 
      mHomeWatcher.stopWatch(); 

     } catch (Exception e) { 
     } 
} 

Bardzo prosta i piękna odpowiedź. Oczekiwanie na głosy i zaakceptowana odpowiedź: p

Powiązane problemy