Cómo establecer un oyente de clic largo en un MenuItem (en un NavigationView)?

¿Cómo puedo fijar un oyente largo del tecleo en un MenuItem ?

He intentado esta respuesta , pero el método no existe para mí. ¿Alguna solución?

Código:

 Menu menu = navigationView.getMenu(); MenuItem menuItem = menu.findItem(R.id.menu_item); // TODO set a long click listener on the menuItem. menuItem.setOnLongClickListener(...); // Method does not exist, any other solutions? 

Editar: no quiero configurar una ActionView personalizada, quiero que el oyente de clic largo a todo el MenuItem , sin una vista personalizada.

Una de muchas maneras (asumiendo que usamos la barra de herramientas) – este ejemplo debe darle la idea de cómo implementar un clic largo en el botón de la barra de herramientas:

 class MyActivity extends Activity { @Override public boolean onCreateOptionsMenu(Menu menu) { /** get menu inflater */ MenuInflater menuInflater = getMenuInflater(); /** Inflate the menu * this adds items to the action bar if it is present. */ menuInflater.inflate(R.menu.menu_home, menu); /** find interesting item */ MenuItem item = menu.findItem(R.id.itemId); /** set action view */ item.setActionView(new ImageButton(this)); // this is a Context.class object /** set listener on action view */ item.getActionView().setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { return false; } }); return super.onCreateOptionsMenu(menu); } } 

In method onCreateOptionsMenu – o cualquier otro método cuando se puede obtener la referencia de un elemento de menú (omita el paso 1-2) :

  1. Crear menú / por ejemplo inflar
  2. Obtener elemento de menú
  3. Crear vista de acción, por ejemplo ImageButton
  4. Establecer el oyente de clic largo en la vista de acción
  5. Establecer en el elemento de menú una vista de acción

Encima de fijé una visión de la acción entonces lo consigo detrás del artículo del menú y del oyente determinado (el orden es no importa él podría ser también de tal manera):

 ImageButton imageButton = new ImageButton(Context); imageButton.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { return false; } }); item.setActionView(imageButton); 

PD. También puede establecer vista de imagen en xml como atributo en el elemento de menú:

  <item ... android:actionViewClass="android.widget.ImageButton" /> then you can get the action view by cast View menuItemActionView = menu.findItem(R.id.itemId).getActionView(); if(menuItemActionView != null && ImageButton.class.isAssignableFrom(menuItemActionView.getCLass())) { ImageButton imageButton = (ImageButton) menuItemActionView; } 

Pero entonces usted fija el oyente largo del tecleo a la visión de la acción solamente, no el artículo entero. – SuperThomasLab

no se está configurando una vista de acción en un solo elemento en este caso se cambia una vista por defecto (al widget ImageButton) para un elemento de menú – la vista de acción podría ser simple o complejo tipo de vista

Pero ¿qué pasa si no quieres cambiar la vista, pero mantener la vista predeterminada? – SuperThomasLab

Ejemplo (esto es una manera de muchos usando un observador de árbol de diseño / estableciendo un oyente de cambio de diseño):

  private View.OnLongClickListener onLongClickListener = new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { return false; } }; @Override public boolean onCreateOptionsMenu(Menu menu) { /** get menu inflater */ MenuInflater menuInflater = getMenuInflater(); /** Inflate the menu * this adds items to the action bar if it is present. */ menuInflater.inflate(R.menu.menu_home, menu); /** geta menu item using findItem(int itemid) */ MenuItem item = menu.findItem(R.id.itemLogOut); /** check if we have item */ if(item!=null) { /** try get its action view */ View actionView = item.getActionView(); /** check if action view is already set? */ if(actionView==null) { /** get item id to comparte later in observer listener*/ final int itemId = item.getItemId(); /** if not set on top most window an layout changes listener */ getWindow().getDecorView() .addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { /** try get view by id we have stored few line up */ View viewById = v.getRootView().findViewById(itemId); /** check if we have any result */ if(viewById!=null) { /** set our listener */ viewById.setOnLongClickListener(onLongClickListener); /** remove layout observer listener */ v.removeOnLayoutChangeListener(this); } } }); } else { /** if set we can add our on long click listener */ actionView.setOnLongClickListener(onLongClickListener); } } } 

Intenté el OnLayoutChangeListener, pero todavía no trabaja Nada cambiado. – SuperThomasLab

Sí lo hace – pero sé la razón por la que it't no está funcionando en su caso ??? – en mi ejemplo verificamos si el artículo de la opinión se coloca en lugar de ese cambio si la visión del menú se pone hacia fuera y después comprueba si el menú contiene el artículo

Aquí está el código de trabajo para que usted estudie:

https://github.com/c3ph3us/LongClickOnMenuItem

En respuesta a otros comentarios:

@ SuperThomasLab No es obvio para mí por qué el método setOnLongClickListener (…) no está disponible para usted. – Hossein Seifi

@ HosseinSeifi – mirar a la interfaz android.view.MenuItem – no proporciona un método de este tipo – por lo que para el buen programador esto debe ser obvio 🙂 por qué no puede llegar a implementar método de clase.

Usted puede lograr al hacer esto:

 action_menu.xml <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:support="http://schemas.android.com/apk/res-auto" > <item android:id="@+id/item1" support:showAsAction="always"> </item> 

Custom_action_view.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="10dp" android:paddingRight="5dp" > <ImageButton android:id="@+id/customActionItem" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:background="@drawable/abc_item_background_holo_dark" android:src="@drawable/bulb_icon" /> </RelativeLayout> 

Y el código del inflador del menú es como sigue:

 public boolean onCreateOptionsMenu(Menu menu) { // TODO Auto-generated method stub MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.action_menu, menu); final MenuItem item1= menu.findItem(R.id.item1); MenuItemCompat.setActionView(item1, R.layout.custom_action_view); View vItem1= MenuItemCompat.getActionView(item1); final ImageButton customActionItem= (ImageButton) vItem1.findViewById(R.id.customActionItem); customActionItem.setOnLongClickListener(new OnLongClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub // do something here } }); return super.onCreateOptionsMenu(menu); } 
  • Efecto de desplazamiento del menú del cajón de navegación
  • ¿Cómo puedo utilizar iconos en el menú de la vista de navegación usando la fuente de icono en android
  • NavigationView (Cambiar color del elemento seleccionado)
  • Deshabilitar un tinte de color en NavigationView sólo para los iconos especificados
  • Cómo agregar un elemento de menú plegable dentro del cajón de navegación en android?
  • ¿Cuál es el tamaño de los iconos del cajón de navegación?
  • Duplicar valor en el encabezado de NavigationView después de actualizar el texto del encabezado
  • El efecto de sombra superpuesto permanece en NavigationView del cajón de navegación
  • NavigationView y diseño personalizado
  • Implementación de la retroinstalación adecuada y manejo de botones de inicio mediante la barra de herramientas en Android
  • Android espresso test NavigationView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.