{"id":1639,"date":"2018-10-17T16:41:51","date_gmt":"2018-10-17T21:41:51","guid":{"rendered":"http:\/\/naps.com.mx\/blog\/?p=1639"},"modified":"2018-10-17T16:49:50","modified_gmt":"2018-10-17T21:49:50","slug":"crear-un-boton-optionsmenu-action-bar","status":"publish","type":"post","link":"https:\/\/naps.com.mx\/blog\/crear-un-boton-optionsmenu-action-bar\/","title":{"rendered":"Crear un bot\u00f3n OptionsMenu para la action bar en Android"},"content":{"rendered":"<p><em><strong>Veamos como colocar un bot\u00f3n OptionsMenu en Android que sea visible en la action bar y nos permita agregar elementos a un ListView a trav\u00e9s de un adapter al que le notificamos cambios.<\/strong><\/em><\/p>\n<p><!--more--><\/p>\n<h2>Crear un bot\u00f3n OptionsMenu<\/h2>\n<p>Lo que deseamos realizar es lo siguiente:<\/p>\n<div id=\"attachment_1641\" style=\"width: 230px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/10-bot\u00f3n-optionsmenu.gif\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1641\" class=\"size-full wp-image-1641\" src=\"http:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/10-bot\u00f3n-optionsmenu.gif\" alt=\"bot\u00f3n optionsmenu\" width=\"220\" height=\"364\" \/><\/a><p id=\"caption-attachment-1641\" class=\"wp-caption-text\">Bot\u00f3n OptionsMenu en Android<\/p><\/div>\n<p>Queremos tener un bot\u00f3n en la parte superior de una aplicaci\u00f3n, es decir, el <em><strong>action bar<\/strong><\/em>. Al pulsar el bot\u00f3n aparecer\u00e1n nuevos elementos en la lista.<\/p>\n<hr \/>\n<p><strong>Consulta las otras entradas previas a este tema:<\/strong><\/p>\n<p><a href=\"http:\/\/naps.com.mx\/blog\/optimizar-un-listview-usando-viewholder\/\"><strong>Optimizar un ListView usando ViewHolder<\/strong><\/a><\/p>\n<p><a href=\"http:\/\/naps.com.mx\/blog\/uso-de-un-listview-en-android\/\"><strong>Uso de un ListView en Android para mostrar una lista de datos<\/strong><\/a><\/p>\n<hr \/>\n<p><strong>Paso 1. Crear un Android resource directory<\/strong><\/p>\n<p>Selecciona la carpeta <em><strong>res<\/strong><\/em>, da clic derecho y ve a <strong>File-&gt;New-&gt;Android resource directory<\/strong><\/p>\n<p>En la caja <em><strong>type<\/strong><\/em> seleccionamos <strong>menu<\/strong>, y como nombre dejamos menu.<\/p>\n<p><strong>Paso 2. Crear un menu resource file<\/strong><\/p>\n<p>Bajo la carpeta <strong>res<\/strong> ahora aparece una opci\u00f3n llamada <strong>menu<\/strong><\/p>\n<p>Le damos clic derecho y luego en <strong>New-&gt;menu resource file<\/strong><\/p>\n<p>En el campo <strong>File name<\/strong> escribimos un nombre como \u201c<em><strong>action_bar_menu<\/strong><\/em>\u201d.<\/p>\n<p>Nos abre un nuevo archivo llamado <em><strong>action_bar_menu.xml<\/strong><\/em><\/p>\n<p>El c\u00f3digo XML de \u00e9ste archivo es el siguiente:<\/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\"\r\n    xmlns:app=\"http:\/\/schemas.android.com\/apk\/res-auto\"&gt;\r\n    &lt;item\r\n        android:id=\"@+id\/add_item\"\r\n        android:icon=\"@android:drawable\/ic_menu_add\"\r\n        app:showAsAction = \"ifRoom\"\r\n        android:title=\"Add\"\r\n        \/&gt;\r\n&lt;\/menu&gt;<\/pre>\n<p>De modo que nuestro bot\u00f3n tiene un id (<em><strong>add_item<\/strong><\/em>), tiene un icono (<em><strong>ic_menu_add<\/strong><\/em> que tiene forma de signo de suma), tiene un title (<em><strong>Add<\/strong><\/em>) y es de tipo <em><strong>ifRoom<\/strong><\/em> (aparece mientras haya espacio en el action bar, de lo contrario, aparece el bot\u00f3n de 3 puntos que indica que las opciones est\u00e1n agrupadas).<\/p>\n<p><strong>Paso 3.<span class=\"Apple-converted-space\">\u00a0 <\/span>Variables a utilizar<\/strong><\/p>\n<p>En la secci\u00f3n de declaraci\u00f3n de variables de la clase MainActivity.java a\u00f1adimos las siguientes:<\/p>\n<pre class=\"lang:java decode:true \">private MyAdapter myAdapter;\r\nprivate int\u00a0 counter=0;<\/pre>\n<p><em><strong>myAdapter<\/strong><\/em> es una variable que ya ten\u00edamos declarada, ahora la estamos declarando a nivel global con relaci\u00f3n a la clase.<\/p>\n<p><em><strong>Counter<\/strong><\/em> es una variable que nos lleva la cuenta de los nuevos elementos y se usa para irlos numerando: Nuevo 1, Nuevo 2, etc.<\/p>\n<p><strong>Paso 4. Sobreescrimos el m\u00e9todo onCreateOptionsMenu<\/strong><\/p>\n<p>El c\u00f3digo a a\u00f1adir es el siguiente:<\/p>\n<pre class=\"lang:java decode:true \">@Override                                              \r\npublic boolean onCreateOptionsMenu(Menu menu){         \r\n    MenuInflater inflater = getMenuInflater();         \r\n    inflater.inflate(R.menu.action_bar_menu, menu);    \r\n    return true;                                       \r\n}<\/pre>\n<p>Lo que estamos haciendo es utilizar nuestro men\u00fa creado en el paso 2, colocandolo en el <em><strong>action bar.<\/strong><\/em><\/p>\n<p><strong>Paso 5. Sobreescribimos el m\u00e9todo <em>onOptionsItemSelected<\/em><\/strong><\/p>\n<p>El c\u00f3digo a a\u00f1adir es:<\/p>\n<pre class=\"lang:java decode:true \">@Override                                             \r\npublic boolean onOptionsItemSelected(MenuItem item){  \r\n    switch (item.getItemId()){                        \r\n        case R.id.add_item:                           \r\n            this.names.add(\"Nuevo \" + (++counter));   \r\n            this.myAdapter.notifyDataSetChanged();    \r\n            return true;                              \r\n        default:                                      \r\n            return super.onOptionsItemSelected(item); \r\n                                                      \r\n    }                                                 \r\n}<\/pre>\n<p>Utilizamos un switch considerando que podr\u00edamos tener m\u00e1s de un bot\u00f3n. En caso de que se pulse el bot\u00f3n <em><strong>add_item<\/strong><\/em> (que creamos en el paso 2) se a\u00f1ade un nuevo elemento al arreglo <em><strong>names<\/strong><\/em>, y se notifica al adapter (<em><strong>myAdapter<\/strong><\/em>) que han habido cambios en los datos.<\/p>\n<p>&nbsp;<\/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<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Veamos como colocar un bot\u00f3n OptionsMenu en Android que sea visible en la action bar y nos permita agregar elementos a un ListView a trav\u00e9s de un adapter al que le notificamos cambios.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"amp_status":"","footnotes":""},"categories":[234],"tags":[198,235,238],"class_list":["post-1639","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\/1639","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=1639"}],"version-history":[{"count":7,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/1639\/revisions"}],"predecessor-version":[{"id":1648,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/1639\/revisions\/1648"}],"wp:attachment":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/media?parent=1639"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/categories?post=1639"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/tags?post=1639"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}