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 :
|
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.
|





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
ResponderEliminarHola! 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.
EliminarSaludos, David