Mostrando entradas con la etiqueta Android Context menu. Mostrar todas las entradas
Mostrando entradas con la etiqueta Android Context menu. Mostrar todas las entradas

Android : Context Menu con imagen por item

Blog >Lista Soluciones >  Context Menu II


Context Menu con ImageView + texto por item




Continuamos con la extensión del post Menu Contextual, en esta ocasión vamos a hacer un contextMenu con una imagen por item.

Aunque lo usemos como ContextMenu, en realidad es un dialogo con una vista personalizada, vamos a utilizar un ListView.

Para seguir con este post es imprescindible tener un listview con imagen + texto, podreis encontrar el código necesario en este post anterior ListView

Una vez tengamos nuestro Listview, simplemente tenemos que convertir esa listview en un AlertDialog clicable, que hará la función de contextMenu. Hay que hacer este "apaño" porque la clase MenuContext no acepta imágenes, ya sea intentando ponerla desde XML como






Como he dicho anteriormente contamos con las siguientes clases y recursos del post ListView que las enumero a continuación:
  • elemento.java 
  • MenuAdapter.java 
  • itemlist.xml 
  • imágenes icon1, icon2, icon3
  • iconomenujuego 


Creamos la clase ContextMenuList, en la que jugamos con el adaptador MenuAdapter, para crear el Dialog con los elementos de su lista, es decir icono + texto:
 
public class ContextMenuList implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener{
 
 private Context context;
 private String titulo;
 private ArrayList arraydir;
 private Activity a;
 int iconoid;
 
 MenuAdapter adaptador;
 //CONSTRUCTOR
 public ContextMenuList(Context c,String titulo,Activity a,int icon) {
  this.context=c;
  this.titulo=titulo;
  this.a=a;
  this.iconoid=icon;
        arraydir = new ArrayList();
 }
 //CREAMOS LA LISTA DE LOS ELEMENTOS DEL MENU
 public void crearListaAdaptador(int recurso, String titulo){
        elemento item;
        item = new elemento(context.getResources().getDrawable(recurso),titulo);
        arraydir.add(item);
 }
 //SE LLAMA UNA VEZ SE ACABA DE LLAMAR A LOS ITEMS
 public void adaptadorCompleto(){
        adaptador= new MenuAdapter(a, arraydir);
 }
 //METODO QUE CREA EL ALERTDIALOG
 public Dialog createMenu() {
  final AlertDialog.Builder builder = new AlertDialog.Builder(context);
  builder.setTitle(titulo);
  builder.setIcon(context.getResources().getDrawable(iconoid));
  builder.setAdapter(adaptador, new DialogInterface.OnClickListener() {
  @Override
  public void onClick(DialogInterface dialoginterface, int i) {
   elemento item = (elemento) adaptador.getItem(i);

   }
  });
  builder.setInverseBackgroundForced(true);
  AlertDialog dialog = builder.create();
  dialog.setOnCancelListener(this);
  dialog.setOnDismissListener(this);
  
  return dialog;
 }
 @Override
 public void onDismiss(DialogInterface dialog) {
 // TODO Auto-generated method stub
 }
 @Override
 public void onCancel(DialogInterface dialog) {
   // TODO Auto-generated method stub
 }
}


Y nuestra actividad principal en la que sólo hemos colocado un botón para cuando hagamos click aparezca el context menu es así :
 
public class MainActivity extends Activity {
 private Button b1;
 private ContextMenuList MenuContextual;
 Dialog dialog;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  MenuContextual=new ContextMenuList(this, "Graficos", this,getResources().getIdentifier("iconomenujuego" , "drawable", getPackageName()));
  MenuContextual.crearListaAdaptador(getResources().getIdentifier("icon1" , "drawable", getPackageName()), " Bitmaps");
  MenuContextual.crearListaAdaptador(getResources().getIdentifier("icon2" , "drawable", getPackageName()), " Vectorial");
  MenuContextual.crearListaAdaptador(getResources().getIdentifier("icon3" , "drawable", getPackageName()),  " 3D");
  MenuContextual.adaptadorCompleto();
  
  
  b1=(Button) findViewById(R.id.button1);
  b1.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    dialog=MenuContextual.createMenu();
    dialog.show();
   }
  });
    } 
}

Pues ya tenemos nuestro Dialog camuflado de Menu Context y con todas sus funcionalidades

Y este es el resultado :




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




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