{"id":1111,"date":"2024-09-12T09:03:00","date_gmt":"2024-09-12T07:03:00","guid":{"rendered":"https:\/\/www.pinguytaz.net\/?p=1111"},"modified":"2024-09-10T02:08:56","modified_gmt":"2024-09-10T00:08:56","slug":"crear-extensiones-para-appinventor-primera-extension-2","status":"publish","type":"post","link":"https:\/\/www.pinguytaz.net\/index.php\/2024\/09\/12\/crear-extensiones-para-appinventor-primera-extension-2\/","title":{"rendered":"Crear extensiones para AppInventor  (Primera extensi\u00f3n) 2"},"content":{"rendered":"\n<p>El fuente de esta primera extensi\u00f3n lo podemos encontrar en <a href=\"https:\/\/github.com\/pinguytaz\/extAppInventor\/blob\/main\/Ejemplos\/src\/losejemplos\/Ej1.java\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/pinguytaz\/extAppInventor\/blob\/main\/Ejemplos\/src\/losejemplos\/Ej1.java<\/a> y comenzamos con la explicaci\u00f3n<\/p>\n\n\n\n<p>Lo primero es generar el entorno de trabajos, que como comentamos en el anterior POST es muy sencillo.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git clone --recurse-submodules https:\/\/github.com\/mit-cml\/extension-template.git Ejemplos<\/code><\/pre>\n\n\n\n<p>Esto nos genera un fichero Ejemplos desde el que lanzaremos nuestros comando \u00abant\u00bb. Como nuestra intenci\u00f3n es generar nuestros ejemplos en un paquete llamado \u00ab<strong>losejemplo<\/strong>\u00bb crearemos este directorio por debajo de <strong>src<\/strong> y sera en este donde coloquemos nuestros ficheros .java con las clases de extensiones que creemos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd Ejemplos\nmkdir src\/losejmplos<\/code><\/pre>\n\n\n\n<p>Creamos el fichero src\/losejemplos\/Ej1.java, podemos descargarlo del enlace que dimos al principio, que creara la extensi\u00f3n Ej1.<\/p>\n\n\n\n<figure class=\"wp-block-image alignright size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"213\" height=\"65\" src=\"https:\/\/www.pinguytaz.net\/wp-content\/uploads\/2024\/08\/image-1.png\" alt=\"\" class=\"wp-image-1113\"\/><\/figure>\n\n\n\n<p> Esta extensi\u00f3n tendr\u00e1 una \u00fanica funci\u00f3n que se representa en el dise\u00f1ador se representa con color morado, como podemos ver.<\/p>\n\n\n\n<p>La funci\u00f3n, llamada Cadena,  es muy sencilla recibe un String (par\u00e1metro texto) y retorna un String.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public String Cadena(String texto) { ..... }<\/code><\/pre>\n\n\n\n<p>Antes de llegar a definir la funci\u00f3n debemos explicar una serie de cosas:<\/p>\n\n\n\n<p>Lo primero sera definir el paquete (package losejemplos) e importar las librerias necesarias, tanto de appinventor (como es nuestro caso) como las librer\u00edas de diandro que necesitemos (ejemplo android.nfc.Tag si vamos a trabajar con NFC) y las nuestras.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package losejemplos;\n\n\/\/ Importaci\u00f3n minima para clases internas y anaotaciones de AI2\nimport com.google.appinventor.components.annotations.DesignerComponent;  \/\/ Componente que aparece en el dise\u00f1ador \nimport com.google.appinventor.components.runtime.AndroidNonvisibleComponent;\nimport com.google.appinventor.components.annotations.SimpleObject;\nimport com.google.appinventor.components.runtime.ComponentContainer;\nimport com.google.appinventor.components.common.ComponentCategory;\nimport com.google.appinventor.components.annotations.SimpleFunction;     \/\/ Ya que definimos una funci\u00f3n\n<\/code><\/pre>\n\n\n\n<p>Luego generamos unas anotaciones que nos permiten que el componente aparezca en el dise\u00f1ador, aunque en nuestro caso sea un componente no visible.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@DesignerComponent(version = 1,\n                    category = ComponentCategory.EXTENSION,\n                    description = \"Un ejemplo simple\",\n                    nonVisible = true,\n                    iconName = \"\")\n@SimpleObject(external = true)<\/code><\/pre>\n\n\n\n<p>Informaci\u00f3n de las anotaciones se pueden ver en los enlaces: <a href=\"https:\/\/appinventor.mit.edu\/blogs\/evan\/2023\/04\/10\/overview-app-inventor-sources-components\">https:\/\/appinventor.mit.edu\/blogs\/evan\/2023\/04\/10\/overview-app-inventor-sources-components<\/a> y en <a href=\"https:\/\/docs.google.com\/document\/d\/1UsjVC6bjf4rKPLP6FULUPeB6C8O-A5GbpYjvvwqTYK8\/edit\">https:\/\/docs.google.com\/document\/d\/1UsjVC6bjf4rKPLP6FULUPeB6C8O-A5GbpYjvvwqTYK8\/edit<\/a><\/p>\n\n\n\n<p>La primera anotaci\u00f3n <strong>@DesignerComponent()<\/strong> que indica que aparecer\u00e1 en la paleta del dise\u00f1ador y definiremos informaci\u00f3n que nos mostrara como:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>description que da una descripci\u00f3n de la extensi\u00f3n y es la que se ve al pulsar en la interrogaci\u00f3n de la extensi\u00f3n que aparece en la paleta.<\/li>\n\n\n\n<li>version<\/li>\n\n\n\n<li>category  La categor\u00eda del componente en el que se incluye, en nuestro caso sera EXTENSION<\/li>\n\n\n\n<li>nonVisible lo pondremos a true para que el componente sea visible en la paleta.<\/li>\n\n\n\n<li>iconName  nombre del archivo del icono que aparece en la paleta (16&#215;16) y podra ser una URL o dejar el nombre en el directorio aiwebres dentro del directorio del paquete \u00abaiwebres\/icono.png\u00bb, por defecto no tiene icono.<\/li>\n<\/ul>\n\n\n\n<p>La otra anotaci\u00f3n sera @SimpleObject(external = true) para indicar que es un componente externo. Tendr\u00edamos otras anotaciones de permisos que hablaremos m\u00e1s adelante.<\/p>\n\n\n\n<p>Y con esto empezamos a generar nuestra clase que heredera de \u00ab<strong>AndroidNonvisibleComponent<\/strong>\u00bb componente no visual y tendr\u00e1 un constructor con las inicializaciones necesarias.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\npublic class Ej1 extends AndroidNonvisibleComponent {\n   public Ej1(ComponentContainer container) {\n        super(container.$form());\n   }   \n...... Nuestro c\u00f3digo en el que definiremos los elementos de la extensi\u00f3n.\n\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image alignleft size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"210\" height=\"78\" src=\"https:\/\/www.pinguytaz.net\/wp-content\/uploads\/2024\/08\/image-2.png\" alt=\"\" class=\"wp-image-1116\"\/><\/figure>\n\n\n\n<p>Ahora solo nos queda a\u00f1adir el comportamiento o bloques de nuestra extensi\u00f3n, en nuestro ejemplo hemos creado un bloque de procedimiento, color morado.<\/p>\n\n\n\n<p>Para crear un m\u00e9todo al que luego llamaremos lo primero es utilizar la anotaci\u00f3n \u00ab<strong>@SimpleFunction()<\/strong>\u00bb y despees definir nuestro m\u00e9todo publico con el tipo de retorno y par\u00e1metros a recoger, en el siguiente POST veremos como crear un par\u00e1metro lista.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  @SimpleFunction(description = \"La descripcion del la funcion que nos aparecera en el interfaz de bloques.)\n  public String Cadena(String texto) {  .... }<\/code><\/pre>\n\n\n\n<p>Y con esto tenemos creada nuestra primera extensi\u00f3n, en la pr\u00f3xima entrega veremos como crear un m\u00e9todo que reciba una lista de valores que se a\u00f1adir\u00e1n desde el interfaz WEB.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>El fuente de esta primera extensi\u00f3n lo podemos encontrar en https:\/\/github.com\/pinguytaz\/extAppInventor\/blob\/main\/Ejemplos\/src\/losejemplos\/Ej1.java y comenzamos con la explicaci\u00f3n Lo primero es generar el entorno de trabajos, que como comentamos en el anterior POST es muy sencillo. Esto nos genera un fichero Ejemplos desde el que lanzaremos nuestros comando \u00abant\u00bb. Como nuestra intenci\u00f3n es generar nuestros ejemplos en [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1113,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-container-style":"default","site-container-layout":"default","site-sidebar-layout":"default","disable-article-header":"default","disable-site-header":"default","disable-site-footer":"default","disable-content-area-spacing":"default","footnotes":""},"categories":[2,6,12],"tags":[21,199,33],"class_list":["post-1111","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-android","category-java","category-openjdk","tag-android","tag-appinventor","tag-java"],"_links":{"self":[{"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/posts\/1111","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/comments?post=1111"}],"version-history":[{"count":7,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/posts\/1111\/revisions"}],"predecessor-version":[{"id":1160,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/posts\/1111\/revisions\/1160"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/media\/1113"}],"wp:attachment":[{"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/media?parent=1111"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/categories?post=1111"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/tags?post=1111"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}