Android : Context Menu al hacer click en un button

Blog >Lista Soluciones >  Context Menu I



Vamos a ver como crear menús contextuales con RadioButton.


Lo primero que vamos a hacer es asociar nuestra actividad principal con el menú contextual mediante un botón que tendremos en la misma.





Ahora vamos a crear nuestro menú contextual mediante un recurso xml, así en que en la carpeta res/menu añadimos un nuevo archiuvo xml en que habrá este código:



    
    
    




A continuación hay que sobreescribir el evento encargado de construir los menús contextuales en los distintos controles de la aplicación, así que llamammos a onCreateContextMenu()

Para cada vez que necesitemos mostrar un menú contextual.
En él usamos la referencia inflater para generar la extructura del menú.


@Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  //REFERENCIA AL BOTON EN LA VISTA
  b1=(Button) findViewById(R.id.button1);
  //EVENTO ONCLICK
  b1.setOnClickListener(new OnClickListener() {
   //ABRIR EL MENU CONTEXTUAL
   @Override
   public void onClick(View v) {

    registerForContextMenu(v);
    openContextMenu(v);
   }
  });
 }
 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo){
  super.onCreateContextMenu(menu, v, menuInfo); 
  MenuInflater inflater= getMenuInflater();
  inflater.inflate(R.menu.menucontext_1, menu);
 }


Y por último, vamos a implementar una función para controlar las acciones según se pulse en un item u otro.



 public boolean onContextItemSelected(MenuItem item){
  switch (item.getItemId()){
  case R.id.menugraficos1:
   return true;
  case R.id.menugraficos2:
   return true;
  case R.id.menugraficos3:
   return true;
  default:
   return super.onContextItemSelected(item);
  }
 }

Y este es el resutado :






Podeis descargar el código fuente de esta primera parte desde Thebestandroide más abajo :




Compartir Compartir Compartir Compartir



Bien, ahora queremos que aparezca un radioButton por cada item que haya en el menú contextual, así que lo primero que hacemos es cambiar el recurso XML para que aparezcan:



    
      
      
      
 



Al poner la etiqueta group con el parámetro checkableBehavior="single" le decimos que todos los radioButton están en un mismo grupo y con ese parámetro en "single" hacemos que sólo se pueda seleccionar 1 de todos.
Finalmente añadimos varias lineas para que ejecuten ese comportamiento cada vez que hacemos click en un item en onContextItemSelected();


public boolean onContextItemSelected(MenuItem item){
  switch (item.getItemId()){
  case R.id.menugraficos1:
   item.setChecked(true);
   return true;
  case R.id.menugraficos2:
   item.setChecked(true);
   return true;
  case R.id.menugraficos3:
   item.setChecked(true);
   return true;
  default:
   return super.onContextItemSelected(item);
  }
 }


Y este es el resultado:




Ya que estamos, y para hacerlo más completo vamos a introducirle un titulo y una imagen al menú para que aparezca siempre que este salte con estas 2 líneas:


 menu.setHeaderTitle("Gráficos");
 menu.setHeaderIcon(R.drawable.iconomenujuego);


Previamente a estas líneas arrastramos a la carpeta drawable para tener la imagen disponible como recurso.




Así que la función quedaría así


 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo){
  super.onCreateContextMenu(menu, v, menuInfo); 
  menu.setHeaderTitle("Gráficos");
  menu.setHeaderIcon(R.drawable.iconomenujuego);
  MenuInflater inflater= getMenuInflater();
  inflater.inflate(R.menu.menucontext_1, menu);


Y este es el resultado :





Bueno una vez todo explicado, a continuación pongo el código entero :

El código del recurso XML, osea el context menu


    
    
     
     
      
     
      
     
 



El código de la actividad principal

public class MainActivity extends Activity {
 private Button b1;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  b1=(Button) findViewById(R.id.button1);

  b1.setOnClickListener(new OnClickListener() {
   
   @Override
   public void onClick(View v) {
    lanzarMenu(v);
   }
  });
 }
 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo){
  super.onCreateContextMenu(menu, v, menuInfo); 
  menu.setHeaderTitle("Gráficos");
  menu.setHeaderIcon(R.drawable.iconomenujuego);
  MenuInflater inflater= getMenuInflater();
  inflater.inflate(R.menu.menucontext_1, menu);
 }

 public boolean onContextItemSelected(MenuItem item){
  switch (item.getItemId()){
  case R.id.menugraficos1:
   item.setChecked(true);
   return true;
  case R.id.menugraficos2:
   item.setChecked(true);
   return true;
  case R.id.menugraficos3:
   item.setChecked(true);
   return true;
  default:
   return super.onContextItemSelected(item);
  }
 }
 //funcion para lanzar el menú
 public void lanzarMenu(View v){
  registerForContextMenu(v);
  openContextMenu(v);
 }
}



Ahora veremos algo aun MÁS interesante respecto a los menus contextuales, ¿Cómo insertar imágenes en cada item del menu contextual?  Lo haremos desde el siguiente post : Contextmenu + imagen por item.



Podeis descargar el código fuente de thebestandroide con sólo compartir en facebook,twitter,linkedin o suscribirte a nuestro canal RSS más abajo. 



Compartir Compartir Compartir Compartir




2 comentarios:

  1. buen día lo probé y no me funciona, tengo froyo instalado pero en verdad necesito un menu contextual, me puedes ayudar? jess2203@gmail.com

    ResponderEliminar
    Respuestas
    1. Hola! Siento comentarte que hace unos meses cerre este blog porque lo estoy migrando a Liferay. Seguramente no te funcione por los xml ya que la conversión del codigo al blog en este lenguaje no lo hace muy bien.

      Saludos, David

      Eliminar