{"id":1649,"date":"2018-10-18T12:11:07","date_gmt":"2018-10-18T17:11:07","guid":{"rendered":"http:\/\/naps.com.mx\/blog\/?p=1649"},"modified":"2018-10-24T16:30:20","modified_gmt":"2018-10-24T21:30:20","slug":"crear-un-contextmenu-en-android","status":"publish","type":"post","link":"https:\/\/naps.com.mx\/blog\/crear-un-contextmenu-en-android\/","title":{"rendered":"Crear un ContextMenu en Android"},"content":{"rendered":"<p><em><strong>Realizaremos un ContextMenu en Android (un men\u00fa contextual) que aparece al hacer una pulsaci\u00f3n larga y que elimina elementos de un ListView\u00a0<\/strong><\/em><\/p>\n<p><!--more--><\/p>\n<p>Deseamos hacer aparecer un men\u00fa contextual cuando se haga una pulsaci\u00f3n larga sobre un elemento de un ListView.<\/p>\n<div id=\"attachment_1650\" style=\"width: 466px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/11-ContextMenu-en-Android.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1650\" class=\"size-full wp-image-1650\" src=\"http:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/11-ContextMenu-en-Android.png\" alt=\"ContextMenu en Android\" width=\"456\" height=\"795\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/11-ContextMenu-en-Android.png 456w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/11-ContextMenu-en-Android-172x300.png 172w\" sizes=\"auto, (max-width: 456px) 100vw, 456px\" \/><\/a><p id=\"caption-attachment-1650\" class=\"wp-caption-text\">ContextMenu en Android<\/p><\/div>\n<hr \/>\n<p>Consulta los otros art\u00edculos relacionados:<\/p>\n<p><strong><a href=\"http:\/\/naps.com.mx\/blog\/uso-de-un-listview-en-android\/\">Uso de un ListView en Android para mostrar una lista de datos<\/a><\/strong><\/p>\n<p><strong><a href=\"http:\/\/naps.com.mx\/blog\/optimizar-un-listview-usando-viewholder\/\">Optimizar un ListView usando ViewHolder<\/a><\/strong><\/p>\n<p><strong><a href=\"http:\/\/naps.com.mx\/blog\/crear-un-boton-optionsmenu-action-bar\/\">Crear un bot\u00f3n OptionsMenu para la action bar en Android<\/a><\/strong><\/p>\n<hr \/>\n<h2>Creaci\u00f3n de un ContextMenu en Android<\/h2>\n<p><strong>Paso 1. Crear el XML con las opciones que contendr\u00e1 el men\u00fa.<\/strong><\/p>\n<p>Ir a carpeta de menu y dar <strong>New-&gt; New Resource File<\/strong><\/p>\n<p>Como nombre asignamos <em><strong>context_menu<\/strong><\/em><\/p>\n<p>En la vista <em><strong>XML<\/strong><\/em> escribimos el siguiente c\u00f3digo:<\/p>\n<pre class=\"lang:xhtml decode:true \">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\r\n&lt;menu xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"&gt;\r\n    &lt;item\r\n        android:id=\"@+id\/delete_item\"\r\n        android:title=\"Borrar\"\r\n        \/&gt;\r\n&lt;\/menu&gt;<\/pre>\n<p>En este caso, nuestro <strong>ContextMenu<\/strong> solo tendr\u00e1 una opci\u00f3n, aunque podr\u00edamos a\u00f1adir m\u00e1s si fuese necesario.<\/p>\n<p><strong>Paso 2.<span class=\"Apple-converted-space\">\u00a0 <\/span>Crear el ContextMenu<\/strong><\/p>\n<p>Sobreescribiremos el m\u00e9todo <em><strong>onCreateContextMenu<\/strong><\/em><\/p>\n<pre class=\"lang:java decode:true \">@Override\r\npublic void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {\r\n    super.onCreateContextMenu(menu, v, menuInfo);\r\n    MenuInflater inflater = getMenuInflater();\r\n    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;\r\n    menu.setHeaderTitle(this.names.get(info.position));\r\n    inflater.inflate(R.menu.context_menu, menu);\r\n}<\/pre>\n<p>En \u00e9ste m\u00e9todo se extrae informaci\u00f3n del men\u00fa (<em><strong>AdapterContextMenuInfo<\/strong><\/em>) para saber la posici\u00f3n del arreglo del elemento sobre el que se hizo una selecci\u00f3n larga (<em><strong>info.position<\/strong><\/em>). Usando este dato, se consigue el nombre del elemento (<em><strong>names.get<\/strong><\/em>) y se utiliza como t\u00edtulo del men\u00fa (<em><strong>menu.setHeaderTitle<\/strong><\/em>).<\/p>\n<p>\u00c9ste m\u00e9todo crea el men\u00fa contextual.<\/p>\n<p><strong>Paso 3. Manejar los eventos clic del menu<\/strong><\/p>\n<p>Sobreescribiremos el m\u00e9todo <em><strong>onContextItemSelected<\/strong><\/em><\/p>\n<pre class=\"lang:java decode:true \">@Override\r\npublic boolean onContextItemSelected(MenuItem item) {\r\n    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();\r\n    switch (item.getItemId()){\r\n        case R.id.delete_item:\r\n            this.names.remove(info.position);\r\n            this.myAdapter.notifyDataSetChanged();\r\n            return true;\r\n        default:\r\n            return super.onContextItemSelected(item);\r\n    }\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p>En \u00e9ste m\u00e9todo extraemos tambi\u00e9n informaci\u00f3n del men\u00fa<span class=\"Apple-converted-space\">\u00a0 <\/span>(<em><strong>AdapterContextMenuInfo<\/strong><\/em>) y utilizamos un switch considerando que el men\u00fa contextual puede tener varias opciones.<\/p>\n<p>En caso de que la opci\u00f3n elegida sea <em><strong>delete_item<\/strong><\/em> se remover\u00e1 el elemento del arreglo (<em><strong>names.remove<\/strong><\/em>) usando la posici\u00f3n obtenida (<em><strong>info.position<\/strong><\/em>). Entonces, se notifican los cambios realizados al adapter (<em><strong>myAdapter.notifyDataSetChanged<\/strong><\/em>).<\/p>\n<p><strong>Paso 4. Registrar el contextMenu del ListView<\/strong><\/p>\n<p>Se debe \u201cregistrar\u201d el <strong>ContextMenu<\/strong> , por lo que se a\u00f1adir\u00e1 la siguiente l\u00ednea al m\u00e9todo <em><strong>onCreate<\/strong><\/em>.<\/p>\n<pre class=\"lang:java decode:true \">registerForContextMenu(listview);\r\n<\/pre>\n<p>Si deseas puedes ver el resultado <a href=\"http:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/12-gif-Contexmenu-android.gif\">aqu\u00ed<\/a>.<\/p>\n<h3>Referencias<\/h3>\n<ol>\n<li><strong>Android (2018). <a href=\"https:\/\/developer.android.com\/guide\/topics\/ui\/menus?hl=es-419\">Men\u00fas<\/a>.<\/strong> Disponible en [https:\/\/developer.android.com\/guide\/topics\/ui\/menus?hl=es-419]. Consultado el [17-oct-2018].<\/li>\n<li><strong>Hashimi, Komatineni y McLean (2010). <a href=\"https:\/\/books.google.com.mx\/books?id=Bam8K5SIiTkC&amp;printsec=frontcover&amp;hl=es&amp;source=gbs_ge_summary_r&amp;cad=0#v=onepage&amp;q&amp;f=false\" class=\"broken_link\">ProAndroid 2<\/a>.<\/strong> APress.<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Realizaremos un ContextMenu en Android (un men\u00fa contextual) que aparece al hacer una pulsaci\u00f3n larga y que elimina elementos de un ListView\u00a0<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"amp_status":"","footnotes":""},"categories":[234],"tags":[198,235,238],"class_list":["post-1649","post","type-post","status-publish","format-standard","hentry","category-aplicaciones-moviles","tag-android","tag-desarrollo-de-aplicaciones-moviles","tag-listview"],"_links":{"self":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/1649","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/comments?post=1649"}],"version-history":[{"count":8,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/1649\/revisions"}],"predecessor-version":[{"id":1674,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/1649\/revisions\/1674"}],"wp:attachment":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/media?parent=1649"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/categories?post=1649"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/tags?post=1649"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}