Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Detección de la pulsación de tecla Menú en Android

Estoy tratando de detectar cuando el botón de menú físico en mi teléfono Android ha sido presionado. A pesar de que el código de abajo funcionaría, pero no lo hace. ¿A dónde voy mal por favor?

El error devuelto es 'Modificador no válido para el parámetro onKeyDown; Sólo se permite final "

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

  • Los botones de notificación de Android no aparecen
  • Android: ImageView getID (); Devolver entero
  • Android: Cambiar el fondo del botón en ListView Row con onClick
  • OnItemClickListener no funciona con el elemento ListView que contiene el botón
  • Iniciar chat de vídeo sin interacción del usuario - Android
  • Cómo subrayar el texto del botón en Android?
  • Cómo cambiar el color de texto del botón de Android de forma global en el tema
  • Reproducción de archivos .wav cortos - Android
  • 6 Solutions collect form web for “Detección de la pulsación de tecla Menú en Android”

    Me gustaría buscar un evento clave, en lugar de un evento, con onKeyUp .

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

    Devolvemos true porque estamos manejando el acontecimiento; Devuelve false si desea que el sistema maneje el evento también.

    También puede hacer todo esto en su instancia de Activity porque Activity es una subclase indirecta conocida de KeyEvent .

    Basado en todo lo anterior, esto parece ser la implementación correcta que consumirá eventos de tecla de menú "up" solamente y pasará otros eventos claves a la superclase.

     public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MENU) { // ... return true; } else { return super.onKeyUp(keyCode, event); } } 
     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); } } 

    Si manejas el evento simplemente devuelve true, si no devuelves false para que el sistema Android pueda pasar el evento al resto de los componentes para manejarlo.

    Asegúrese de anular el método onKeyDown en su clase de actividad. Hay otro método onKeyDown en la clase View pero no se llamará si se presiona la tecla de menú.

    Tengo una respuesta muy fría de esta pregunta 🙂 He intentado por última vez 1 año lol y sólo foundout la solución 3 días antes.Por favor, mire la respuesta. Usted necesita hacer una clase de Septate de observador de Hogar. Exactamente use el siguiente código con el nombre de 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(); }*/ } } } } } } 

    Después de hacer la clase HomeWatcher. Debe declarar el Homewatcher en la clase deseada en la que desea detectar el botón de inicio y el botón de Aplicaciones recientes.

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

    Al final de esto sólo tiene que agregar onPause y OnResume Overide método como este.

     @Override protected void onResume() { super.onResume(); try { mHomeWatcher.startWatch(); } catch (Exception e) { } } @Override protected void onPause() { super.onPause(); try { mHomeWatcher.stopWatch(); } catch (Exception e) { } } 

    Una respuesta muy simple y hermosa. Esperando los votos y la respuesta aceptada: p

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.