Cómo crear un PopupMenu personalizado en Android

¿Cómo puedo replicar algo como lo hice a continuación en Balsamiq?

Hice este menú, pero sólo se muestra el texto de los elementos (no los iconos). ¿Es posible mostrar el título y el icono en un PopupMenu?

Aquí está mi create_post_menu.xml

 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/action_photo" android:icon="@drawable/ic_action_camera" android:title="@string/action_photo" android:showAsAction="always|withText" /> <item android:id="@+id/action_video" android:icon="@drawable/ic_action_video" android:title="@string/action_video" android:showAsAction="always|withText" /> <item android:id="@+id/action_text" android:icon="@drawable/ic_action_edit" android:title="@string/action_text" android:showAsAction="always|withText" /> <item android:id="@+id/action_link" android:icon="@drawable/ic_action_web_site" android:title="@string/action_link" android:showAsAction="always|withText" /> </menu> 

UN

Editar

Estos son mis métodos onCreateOptionsMenu y onOptionsItemSelected :

 @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.action_new) { View menuItemView = findViewById(R.id.action_new); PopupMenu popupMenu = new PopupMenu(this, menuItemView); popupMenu.inflate(R.menu.create_post_menu); popupMenu.show(); return true; } else if(item.getItemId() == R.id.action_search) { return true; } else if(item.getItemId() == R.id.action_settings) { startActivity(new Intent(MainActivity.this, SettingsActivity.class)); return true; } else if(item.getItemId() == R.id.action_help) { return true; } else { return super.onOptionsItemSelected(item); } } 

create_post_menu este problema simplemente poniendo el create_post_menu dentro del item cuyo icono es un + .

Por ejemplo, tengo (usando AppCompat):

 <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/action_new" android:icon="@drawable/ic_action_new" android:title="@string/action_new" app:showAsAction="always"> <menu> <item android:id="@+id/action_photo" android:icon="@drawable/ic_action_camera" android:title="@string/action_photo" app:showAsAction="always|withText" /> <item android:id="@+id/action_video" android:icon="@drawable/ic_action_video" android:title="@string/action_video" app:showAsAction="always|withText" /> <item android:id="@+id/action_text" android:icon="@drawable/ic_action_text" android:title="@string/action_text" app:showAsAction="always|withText" /> <item android:id="@+id/action_place" android:icon="@drawable/ic_action_place" android:title="@string/action_place" app:showAsAction="always|withText" /> <item android:id="@+id/action_more" android:title="@string/action_more" android:visible="false" app:showAsAction="always|withText" /> </menu> </item> ...(more menu items here) </menu> 

Sin AppCompat, podría simplemente deshacerse de la app espacio de nombres XML sustituyendo la app por android .

 import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.PopupMenu; import android.widget.Toast; public class MainActivity extends Activity { Button button1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button1 = (Button) findViewById(R.id.button1);//your created butto 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 } } 

Espero que mi respuesta anterior aquí le pueda ayudar.
Si sólo desea un menú emergente similar, puede utilizar ActionProvider. Es más poderoso.
Si lo desea como un verdadero menú, puede utilizar personalizado PopupMenu.

  • Android: Uso de PopupMenu en el nivel 9 de API
  • AppCompat PopUp menu RuntimeException
  • Ocultar el elemento de popupmenu
  • Cómo configurar el fondo de Android PopupMenu a Blanco
  • Creación de un menú de opciones emergentes en una barra de acción contextual
  • Implementar menú emergente con margen
  • Detectar que un PopupMenu está cerrado en el nivel 11 de API
  • ¿Cómo puedo reemplazar mi código popupmenu con la lista popupwindow?
  • Se ha intentado finalizar un evento de entrada pero el receptor de eventos de entrada ya se ha eliminado
  • Cómo cambiar la fuente de elementos de PopupMenu
  • La mejor manera de crear menú desplegable en android 2.x como en ICS
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.