Menú desplegable personalizado de Android / menú emergente

¿Cómo hago un menú desplegable / emergente personalizado anclado a un botón?

Necesito que funcione como el menú emergente (anclado a una vista) y hago algo cuando hago clic en un elemento del menú.

¿Cómo agrego elementos al menú por código, manteniendo la altura del menú y puedo desplazarlo si hay más de 5 elementos? No necesito agregar ninguna imagen, solo texto.

enter image description here

Para crear un menú emergente en Android.

activity_main.xml

Contiene solo un botón.

Archivo: activity_main.xml

   

popup_menu.xml

Contiene tres elementos como se muestra a continuación. Se crea dentro del directorio res / menu. Archivo: poupup_menu.xml

      

Clase de actividad

Muestra el menú emergente al hacer clic en el botón. Archivo: MainActivity.java

 public class MainActivity extends Activity { private Button button1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button1 = (Button) findViewById(R.id.button1); button1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //Creating the instance of PopupMenu PopupMenu popup = new PopupMenu(MainActivity.this, button1); //Inflating the Popup using xml file popup.getMenuInflater() .inflate(R.menu.popup_menu, popup.getMenu()); //registering popup with OnMenuItemClickListener popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { Toast.makeText( MainActivity.this, "You Clicked : " + item.getTitle(), Toast.LENGTH_SHORT ).show(); return true; } }); popup.show(); //showing popup menu } }); //closing the setOnClickListener method } } 

Para agregar programáticamente:

 PopupMenu menu = new PopupMenu(this, view); menu.getMenu().add("One"); menu.getMenu().add("Two"); menu.getMenu().add("Three"); menu.show(); 

Siga este enlace para crear un menú programáticamente.

Sé que esta es una vieja pregunta, pero encontré otra respuesta que funcionó mejor para mí y no parece aparecer en ninguna de las respuestas.

Crea un diseño xml:

     

Crea una ListPopupWindow y un mapa con el contenido:

 ListPopupWindow popupWindow; List> data = new ArrayList<>(); HashMap map = new HashMap<>(); map.put(TITLE, getString(R.string.left)); map.put(ICON, R.drawable.left); data.add(map); map = new HashMap<>(); map.put(TITLE, getString(R.string.right)); map.put(ICON, R.drawable.right); data.add(map); 

Luego, al hacer clic, muestra el menú usando esta función:

 private void showListMenu(final View anchor) { popupWindow = new ListPopupWindow(this); ListAdapter adapter = new SimpleAdapter( this, data, R.layout.shoe_select, new String[] {TITLE, ICON}, // These are just the keys that the data uses (constant strings) new int[] {R.id.shoe_select_text, R.id.shoe_select_icon}); // The view ids to map the data to popupWindow.setAnchorView(anchor); popupWindow.setAdapter(adapter); popupWindow.setWidth(400); popupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView< ?> parent, View view, int position, long id) { switch (position){ case 0: devicesAdapter.setSelectedLeftPosition(devicesList.getChildAdapterPosition(anchor)); break; case 1: devicesAdapter.setSelectedRightPosition(devicesList.getChildAdapterPosition(anchor)); break; default: break; } runOnUiThread(new Runnable() { @Override public void run() { devicesAdapter.notifyDataSetChanged(); } }); popupWindow.dismiss(); } }); popupWindow.show(); } 

Primero, crea una carpeta llamada “menú” en la carpeta “res”.

 < ?xml version="1.0" encoding="utf-8"?>          

Luego, crea tu clase de actividad:

 public class PopupMenu1 extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.popup_menu_1); } public void onPopupButtonClick(View button) { PopupMenu popup = new PopupMenu(this, button); popup.getMenuInflater().inflate(R.menu.popup, popup.getMenu()); popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { Toast.makeText(PopupMenu1.this, "Clicked popup menu item " + item.getTitle(), Toast.LENGTH_SHORT).show(); return true; } }); popup.show(); } } 

El camino de Kotlin

 fun showPopupMenu(view: View) { PopupMenu(view.context, view).apply { menuInflater.inflate(R.menu.popup_men, menu) setOnMenuItemClickListener { item -> Toast.makeText(view.context, "You Clicked : " + item.title, Toast.LENGTH_SHORT).show() true } }.show() } 

ACTUALIZACIÓN: En el código anterior, la función aplicar devuelve this que no es necesario, por lo que podemos usar run que no devuelve nada y para hacerlo aún más simple también podemos eliminar las llaves del método showPopupMenu.

Incluso más simple:

 fun showPopupMenu(view: View) = PopupMenu(view.context, view).run { menuInflater.inflate(R.menu.popup_men, menu) setOnMenuItemClickListener { item -> Toast.makeText(view.context, "You Clicked : " + item.title, Toast.LENGTH_SHORT).show() true } show() }