<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Androideity</title>
	
	<link>http://androideity.com</link>
	<description>Programación android en español, tutoriales, documentación, noticias, smartphones, tablets, programación android, aplicaciones android</description>
	<lastBuildDate>Sun, 27 May 2012 20:21:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/androideity" /><feedburner:info uri="androideity" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Aprendiendo a dominar Eclipse: Errores en el proyecto</title>
		<link>http://feedproxy.google.com/~r/androideity/~3/uy7l_Ciw-rc/</link>
		<comments>http://androideity.com/2012/05/23/aprendiendo-a-dominar-eclipse-errores-en-el-proyecto/#comments</comments>
		<pubDate>Wed, 23 May 2012 16:43:42 +0000</pubDate>
		<dc:creator>Condesa</dc:creator>
				<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[herramientas]]></category>
		<category><![CDATA[primeros pasos en android]]></category>
		<category><![CDATA[recomendaciones]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://androideity.com/?p=3503</guid>
		<description><![CDATA[<a href="http://androideity.com/2012/05/23/aprendiendo-a-dominar-eclipse-errores-en-el-proyecto/"><img align="left" hspace="5" width="100" height="100" src="http://androideity.com/wp-content/uploads/2012/05/errores_eclipse-150x150.png" class="alignleft wp-post-image tfe" alt="" title="Errores en Eclipse" /></a>A la par de aprender a dominar alguna plataforma de desarrollo, considero que la experiencia que tengas utilizando un IDE también es parte fundamental para agilizar las tareas diarias de codeo y debugueo de tus proyectos. Por esa razón considero &#8230; <a href="http://androideity.com/2012/05/23/aprendiendo-a-dominar-eclipse-errores-en-el-proyecto/">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a title="Errores en Eclipse" href="http://androideity.com/wp-content/uploads/2012/05/errores_eclipse.png" target="_blank"><img class="aligncenter size-full wp-image-3506" style="margin-top: 10px; margin-bottom: 10px;" title="Errores en Eclipse" src="http://androideity.com/wp-content/uploads/2012/05/errores_eclipse.png" alt="" width="578" height="280" /></a></p>
<p>A la par de aprender a dominar alguna plataforma de desarrollo, considero que la experiencia que tengas utilizando un IDE también es parte fundamental para agilizar las tareas diarias de codeo y debugueo de tus proyectos.</p>
<p>Por esa razón considero importante ir recopilando en una serie de posts, los errores más comunes con los que nos podemos encontrar en un día normal de desarrollo y tratar de explicar las razones por las que ocurren y mejor aún, cómo es que se resuelven. Esto puede ayudarte a que no termines desperdiciando valiosas horas en estas cuestiones y puedas seguir enfocándote al desarrollo de tu proyecto.</p>
<p><span id="more-3503"></span></p>
<p>¿Alguna vez te has encontrado con el siguiente error?</p>
<p><a href="http://androideity.com/wp-content/uploads/2012/05/eclipse_error01.png"><img class="aligncenter size-full wp-image-3504" title="Eclipse IDE" src="http://androideity.com/wp-content/uploads/2012/05/eclipse_error01.png" alt="" width="537" height="158" /></a></p>
<p>Estoy segura que tu respuesta es un &#8220;Sí&#8221;. Y bueno, ¿este error por qué razón surge? Regularmente viene asociado con los siguientes escenarios:</p>
<p>&nbsp;</p>
<p>1. Cuando existe un error explícito dentro de una de las clases que estás manejando en tu proyecto. Es decir, algún error de sintáxis en tu código Java. Este escenario es el más fácil de identificar ya que posterior a este cuadro de diálogo, Eclipse nos indicará por medio de una &#8220;x&#8221; de color rojo en el <em>Package Explorer</em> la clase y paquete que contiene el error.</p>
<p style="padding-left: 30px;"><em>Solución:</em> Obviamente corregir el error sintáctico cometido y volver a ejecutar nuestro proyecto.</p>
<p>&nbsp;</p>
<p>2. Cuando en algún layout que hemos creado hemos cometido algún error sintáctico al momento de nombrar una etiqueta. Por ejemplo, el hecho de escribir &#8220;&lt;linearlayout&#8230;&gt;&#8221; en lugar de &#8220;&lt;LinearLayout&#8230;&gt;&#8221; es suficiente para que este error se presente. En ocasiones no resulta tan obvio el error pues Eclipse no lo marca como tal, pero a la hora de compilar no nos permitirá ejecutar el proyecto.  (Yo he visto que las personas que recién empiezan cometen este error de forma recurrente, o al menos eso he notado en los talleres básicos que he dado&#8230; #TrueStory).</p>
<p style="padding-left: 30px;"><em>Solución:</em> Sigue las convenciones, respeta el nombre de las clases tal como lo indica el SDK y la documentación.</p>
<p>&nbsp;</p>
<p>3. Hay veces en las que la clase <em>R.java</em> del directorio <em>gen</em> se daña y deja de generar automáticamente las referencias a nuevos recursos que agreguemos al proyecto. En estos casos, aunque hayamos agregado un widget con un ID asignado en algún archivo de layout, desde el código Java no podremos llamarlo pues no se encontrará la referencia.</p>
<p style="padding-left: 30px;"><em>Solución:</em> Utiliza la opción <em>Project &gt; Clean&#8230;</em> de Eclipse, eso en la mayoría de los casos permite reconstruir el proyecto y con ello la clase <em>R.java</em></p>
<p>&nbsp;</p>
<p>4. El último escenario en el que me ha tocado estar es cuando tu <em>Debug Certificate</em> ha expirado. Cuando estamos creando una aplicación se firma con un certificado que indica que la app es de &#8220;pruebas&#8221;. Este certificado tiene una duración de 1 año y cuando llegamos al cumplimiento de ese plazo es cuando es necesario renovarlo.</p>
<p style="padding-left: 30px;"><em>Solución:</em> Debemos borrar un archivo llamado <em>debug.keystore</em>. Para conocer su ubicación en nuestro equipo, nos vamos a la opción <em>Window &gt; Preferences &gt; Android &gt; Build</em> y en el campo <em>Default debug keystore</em> encontramos la ruta.</p>
<p style="padding-left: 30px;">Procedemos a borrar el archivo y para generar un nuevo certificado, bastará con elegir la opción <em>Project &gt; Clean..</em>. Con esto puedes volver a trabajar sin problemas.</p>
<p>La última recomendación es que te auxilies de la pestaña <em>Problems</em> que podemos agregar en la opción <em>Window &gt; Show View &gt; General</em>, y que nos indica los warnings y problemas que presenta nuestro proyecto. Entre la información que nos muestra está:</p>
<ul>
<li><em>Description</em> del error/warning</li>
<li><em>Resource</em> que indica el nombre del archivo en donde se encuentra el error/warning</li>
<li><em>Path</em> que es la ruta del archivo que contiene el error/warning en el proyecto</li>
<li><em>Location</em> que nos indica la línea en la cual se encuentra el error/warning</li>
<li><em>Type</em> que nos indica el tipo de problema que es</li>
</ul>
<p style="text-align: center;"><a title="Errores en Eclipse" href="http://androideity.com/wp-content/uploads/2012/05/eclipse_error02.png" target="_blank"><img class="aligncenter  wp-image-3509" style="margin-top: 10px; margin-bottom: 10px;" title="Errores en Eclipse" src="http://androideity.com/wp-content/uploads/2012/05/eclipse_error02.png" alt="" width="490" height="119" /></a></p>
<p>Las herramientas que nos brinda Eclipse son precisamente para facilitarnos algunas tareas así que en la medida de lo posible sácales jugo.</p>
<p>Si te has encontrado con este error en algún otro escenario que no mencioné en este post, platícanos cuál fue y cómo resolviste el problema.</p>
<p>También te invito a que si te has enfrentado a otro tipo de dificultades con Eclipse nos comentes para que podamos armar un post que le ayude a todos los lectores a encontrar las soluciones aquí en la comunidad.</p>
<p>&nbsp;</p>
<p style="text-align: center;"><strong>¿Te fue útil este post? ¡Compártelo!</strong></p>
<p>&nbsp;</p>
<img src="http://feeds.feedburner.com/~r/androideity/~4/uy7l_Ciw-rc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://androideity.com/2012/05/23/aprendiendo-a-dominar-eclipse-errores-en-el-proyecto/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://androideity.com/2012/05/23/aprendiendo-a-dominar-eclipse-errores-en-el-proyecto/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=aprendiendo-a-dominar-eclipse-errores-en-el-proyecto</feedburner:origLink></item>
		<item>
		<title>Animación de Views en Android usando Eclipse</title>
		<link>http://feedproxy.google.com/~r/androideity/~3/iD6G9J0i85M/</link>
		<comments>http://androideity.com/2012/05/20/animacion-de-views-en-android-usando-eclipse/#comments</comments>
		<pubDate>Sun, 20 May 2012 17:56:02 +0000</pubDate>
		<dc:creator>jaime</dc:creator>
				<category><![CDATA[Diseño]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[animaciones en android]]></category>
		<category><![CDATA[conceptos básicos]]></category>
		<category><![CDATA[conociendo Android]]></category>
		<category><![CDATA[diseño en Android]]></category>
		<category><![CDATA[eclipse]]></category>

		<guid isPermaLink="false">http://androideity.com/?p=3479</guid>
		<description><![CDATA[<a href="http://androideity.com/2012/05/20/animacion-de-views-en-android-usando-eclipse/"><img align="left" hspace="5" width="100" height="100" src="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views-0-150x150.png" class="alignleft wp-post-image tfe" alt="" title="Animacion Views" /></a>Twitter: @JaimeYesidLeon  Cuando estás desarrollando una aplicación en Android u otra plataforma el diseño estético es muy importante, es la primera impresión que se lleva el usuario cuando usa tu desarrollo, por eso  las animaciones son una de esas armas &#8230; <a href="http://androideity.com/2012/05/20/animacion-de-views-en-android-usando-eclipse/">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="https://twitter.com/#!/JaimeYesidLeon" target="_blank"><span style="color: #3399ff;"><strong>Twitter: @JaimeYesidLeon</strong></span></a></p>
<p style="text-align: center;"><a href="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views-0.png"><img class="aligncenter size-full wp-image-3481" style="margin-top: 20px; margin-bottom: 20px;" title="Animacion Views" src="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views-0.png" alt="" width="576" height="347" /></a></p>
<p> Cuando estás desarrollando una aplicación en Android u otra plataforma el diseño estético es muy importante, es la primera impresión que se lleva el usuario cuando usa tu desarrollo, por eso  las animaciones son una de esas armas que debes saber usar. Hoy te traemos una manera muy práctica de generar animaciones a los Views de Android sin que llevemos el  procesador del dispositivo a las llamas y sin que tengamos que usar la última versión de OpenGL para que se vea un efecto agradable en tus aplicaciones.</p>
<p><span id="more-3479"></span></p>
<p>Si en algún momento mientras programas tus aplicaciones para Android sientes que les hace falta un no sé qué o un no sé dónde y sientes que los colores e imágenes estáticas no te son suficientes  para darle ese toque propio y sientes que para hacer una animación es necesario el manejo especial de OpenGl 2.0 o una librería específica para tal objetivo, tenemos que decirte que no busques más ya que hoy te traemos una herramienta muy útil para darle ese toque mágico a tus líneas de código y hacer que te sientas mejor con el resultado de tu trabajo.</p>
<p style="text-align: center;"><a href="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views-1.png"><img class="aligncenter size-full wp-image-3482" style="margin-top: 20px; margin-bottom: 20px;" title="Animacion Views" src="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views-1.png" alt="" width="448" height="154" /></a></p>
<p> A lo que estamos haciendo referencia es de la posibilidad que puedas animar por ejemplo los View de Android como los TextView y las imágenes que cargas a tu desarrollo, a las cuales puedes generarles efectos de transparencia, rotación, translación y zoom dentro del área de visión del móvil así como controlar las características de la animación, control de inicio y fin de la misma. Así que hoy te mostraremos las 4 características a las que te hacemos referencia en una sencilla aplicación que con solo un botón puedas ver cada una de las animaciones, y te mostraremos en un video como se ven estas aplicaciones en plena ejecución, así que manos a la obra.</p>
<p>Como primera instancia te dejamos el link de la página oficial de Android en donde encontrarás con lujo de detalles, <a title="Animación Views" href="http://developer.android.com/guide/topics/resources/animation-resource.html" target="_blank">http://developer.android.com/guide/topics/resources/animation-resource.html</a> y el cual te ayudará a despejar las dudas que no te podamos aclarar con este tutorial. El objetivo es que detectes las posibilidades que tienes en Android y tu puedas profundizar en los detalles que más se ajusten a tu necesidad, así que por nada dejes de consultarlo y ver como puedes darle un mejor aspecto visual a tu aplicación.</p>
<p style="text-align: center;"><a href="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views.jpg"><img class="aligncenter size-full wp-image-3483" style="margin-top: 20px; margin-bottom: 20px;" title="Animacion Views" src="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views.jpg" alt="" width="377" height="336" /></a></p>
<p> Si te sigues preguntando como puedes hacer que tu textos cambien su tamaño y vuelvan al original, como hacer para que esos botones se muevan y retornen a su punto original y como hacer para que esa imagen rote cada vez que el usuario pulse sobre mi app; la respuesta es que solo con generar un archivo .xml con las propiedades que quieras aplicar y después con solo hacer referencia al archivo dentro del código puedes generarlo. Así que empecemos a ver como hacer ese archivo .XML:</p>
<p>Lo primero que debes hacer es crear una carpeta llamada “<strong>anim” </strong>la cual debes guardar en la carpeta principal <strong>“res”</strong> dentro del proyecto en el cual estés trabajando; con la carpeta ya lista vas a crear un nuevo archivo con extensión .XML y al cual puedes darle el nombre que desees y así pasamos a editar cualquiera de las 4 propiedades para aplicar en nuestras animaciones las cuales son las siguientes:</p>
<p><strong>&lt;alpha&gt;</strong> esta propiedad hace referencia a la transparencia que le puedes dar al View al cual vallas a aplicar la animación, básicamente lo que puedes hacer es un efecto fantasma, hacer que desaparezca o se vuelva visible un objeto dependiendo de los tiempos que quieras.</p>
<p><strong>&lt;scale&gt;</strong> esta propiedad hace referencia al “zoom” que puede tomar la aplicación sobre un determinado objeto, esto hará que por ejemplo tu imagen sea mas grande o menos que la que originalmente definiste.</p>
<p><strong>&lt;translate&gt;</strong> con esta característica defines un movimiento del objeto que quieras manipular, por ejemplo puedes hacer un efecto de créditos como los que aparecen al final de una película, haciendo que se desplace de abajo hacia arriba u n determinado texto.</p>
<p><strong>&lt;rotate&gt;</strong> por último con esta propiedad puedes hacer por ejemplo que una imagen rote determinados grados sobre un determinado eje.</p>
<p>Cada una de las anteriores características de las animaciones tiene determinados atributos para que la animación pueda llevarse a cabo, no te explicaremos todos porque en el enlace que te dejamos arriba están todos muy bien explicados pero con los que usaremos te harás una idea del efecto que produce cada atributo y los puedas acomodar a tu código.</p>
<p>Aquí te dejamos el código genérico de las 4 diferentes características de las animaciones, en donde “float” en un valor de tipo flotante que tu definirás para el efecto deseado, el cual podrás ver mucho mejor de manera experimental y acomodar mucho mejor para generar una animación única y propia tuya:</p>
<p style="text-align: center;"><a href="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views-3.png"><img class="aligncenter size-full wp-image-3484" style="margin-top: 20px; margin-bottom: 20px;" title="Animacion Views" src="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views-3.png" alt="" width="535" height="480" /></a></p>
<p> Cabe mencionar que puedes generar cuantos archivos de animación desees con diferentes números de animaciones y combinaciones que imagines ya que a no todos los objetos se les ajusta correctamente la misma combinación. En nuestro código de ejemplo tendremos 6 botones con los cuales podrás apreciar el efecto de las animaciones aplicadas a un texto y a una imagen, 4 de los cuales hacen referencia a las propiedades principales y con los otros 2 podrás ver el efecto de las propiedades sumadas y haciendo una efecto mucho mejor. Dejemos tanta explicación y vamos al código:</p>
<ol start="1">
<li>Creamos un proyecto en Eclipse con el nombre que deseemos, en nuestro caso lo llamamos AnimacionView, con la versión que deseemos como por ejemplo la 2.3, le damos el nombre a nuestro paquete, nosotros escogimos com.androideity.animacion, y por último creamos la actividad principal, nosotros la llamamos MainActivity.</li>
<li>Vamos ahora a modificar nuestro <em>layout</em> “main.mxl” de tal manera que nos muestre una imagen a la cual le aplicaremos las diferentes animaciones, debajo 3 botones que actuarán como ejecutores de las animaciones, debajo de estos botones colocamos un TextView para ver que las animaciones también tienen efecto en este tipo de recursos; por último colocamos 3 botones más que servirán para lo mismo que los 3 anteriores pero con diferentes efectos. Vemos una imagen para que sea más claro todo:</li>
</ol>
<p style="text-align: center;"><a href="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views-2.png"><img class="aligncenter size-full wp-image-3480" style="margin-top: 20px; margin-bottom: 20px;" title="Animacion Views" src="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views-2.png" alt="" width="336" height="443" /></a></p>
<p> El código del layout main.xml que dispone los elementos de esta manera es el siguiente:</p>
<p style="text-align: center;"><a href="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views-4.png"><img class="aligncenter size-full wp-image-3486" style="margin-top: 20px; margin-bottom: 20px;" title="Animacion Views" src="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views-4.png" alt="" width="507" height="480" /></a></p>
<p style="text-align: center;"><a href="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views-5.png"><img class="aligncenter size-full wp-image-3487" style="margin-top: 20px; margin-bottom: 20px;" title="Animacion Views" src="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views-5.png" alt="" width="480" height="572" /></a></p>
<p style="text-align: center;"><a href="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views-6.png"><img class="aligncenter size-full wp-image-3485" style="margin-top: 20px; margin-bottom: 20px;" title="Animacion Views" src="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views-6.png" alt="" width="480" height="573" /></a></p>
<p> 3.  Como ya tenemos los elementos que van en nuestro layout vamos a crear otro archivos a los cuales vamos a hacer referencia cuando queramos aplicar las animaciones. Para esto creamos una carpeta llamada “anim” dentro del folder principal “res”. Aquí dentro de la carpeta “anim” creamos 6 archivos con extensión .xml que los pueden llamar como deseen, nosotros los llamamos como se ven en la siguiente imagen:</p>
<p style="text-align: center;"><a href="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views-71.png"><img class="aligncenter size-full wp-image-3489" style="margin-top: 20px; margin-bottom: 20px;" title="Animacion Views" src="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views-71.png" alt="" width="336" height="403" /></a></p>
<p> El contenido de cada archivo es el siguiente:</p>
<p>Para el archivo “escalar.xml” podremos crear una animación que haga una especie de zoom, a nuestro View y el código es el mostrado en la siguiente imagen:</p>
<p style="text-align: center;"><a href="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views-8.png"><img class="aligncenter size-full wp-image-3491" style="margin-top: 20px; margin-bottom: 20px;" title="Animacion Views" src="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views-8.png" alt="" width="640" height="281" /></a></p>
<p> Para el archivo “rotar.xml” podremos crear una animación rote nuestro View, y el código es el siguiente:</p>
<p style="text-align: center;"><a href="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views-9.png"><img class="aligncenter size-full wp-image-3492" style="margin-top: 20px; margin-bottom: 20px;" title="Animacion Views" src="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views-9.png" alt="" width="640" height="215" /></a></p>
<p> Para el archivo “mezcla1.xml” podremos crear una animación que suma la aplicación de rotar y escalar nuestro View, y el código es el siguiente:</p>
<p style="text-align: center;"><a href="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views-10.png"><img class="aligncenter size-full wp-image-3493" style="margin-top: 20px; margin-bottom: 20px;" title="Animacion Views" src="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views-10.png" alt="" width="635" height="480" /></a></p>
<p> Para el archivo “transladar.xml” podremos crear una animación que desplaza nuestro View en un area de la pantalla y el código es el siguiente:</p>
<p style="text-align: center;"><a href="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views-11.png"><img class="aligncenter size-full wp-image-3494" style="margin-top: 20px; margin-bottom: 20px;" title="Animacion Views" src="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views-11.png" alt="" width="640" height="213" /></a></p>
<p> Para el archivo “transparencia.xml” podremos crear una animación que modifica el atributo alpha de nuestro View, el cual genera un efecto de transparencia, y el código es el siguiente:</p>
<p style="text-align: center;"><a href="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views-12.png"><img class="aligncenter size-full wp-image-3495" style="margin-top: 20px; margin-bottom: 20px;" title="Animacion Views" src="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views-12.png" alt="" width="640" height="211" /></a></p>
<p> Para el archivo “mezcla2.xml” podremos crear una animación que suma el código del archivo de translación y transparencia y genera un mejor efecto a nuestro View, y el código es el siguiente:</p>
<p style="text-align: center;"><a href="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views-13.png"><img class="aligncenter size-full wp-image-3490" style="margin-top: 20px; margin-bottom: 20px;" title="Animacion Views" src="http://androideity.com/wp-content/uploads/2012/05/Animacion-Views-13.png" alt="" width="640" height="376" /></a></p>
<p> 4.  Por último creamos el código de nuestra actividad principal que será encargada de darle la lógica a nuestra aplicación, cuyo código es muy sencillo y no necesita mucha explicación, tan solo instanciamos el texto y la imagen a las cuales vamos aplicarle las animaciones esto en el método “onCreate”. Como vemos a continuación:</p>
<p>&nbsp;</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.androideity.animacionsimple</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">android.app.Activity</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">android.os.Bundle</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">android.view.View</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">android.view.View.OnClickListener</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">android.view.animation.Animation</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">android.view.animation.AnimationUtils</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">android.widget.Button</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">android.widget.ImageView</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">android.widget.LinearLayout</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">android.widget.TextView</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MainActivity <span style="color: #000000; font-weight: bold;">extends</span> Activity <span style="color: #009900;">&#123;</span>
    <span style="color: #008000; font-style: italic; font-weight: bold;">/** Called when the activity is first created. */</span>
    <span style="color: #000000; font-weight: bold;">private</span> TextView texto<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Button</span> btnRotar,btnEscalar,btnTrans,btnMover,btnMezcla1,btnMezcla2 <span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> ImageView logo<span style="color: #339933;">;</span>
	@Override
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> onCreate<span style="color: #009900;">&#40;</span>Bundle savedInstanceState<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">onCreate</span><span style="color: #009900;">&#40;</span>savedInstanceState<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        setContentView<span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">layout</span>.<span style="color: #006633;">main</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        texto <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>TextView<span style="color: #009900;">&#41;</span>findViewById<span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">id</span>.<span style="color: #006633;">txt_anim</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        logo <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>ImageView<span style="color: #009900;">&#41;</span>findViewById<span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">id</span>.<span style="color: #006633;">logo</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        logo.<span style="color: #006633;">setBackgroundResource</span><span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">ic_launcher</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p>&nbsp;</p>
<p>5.  Por último creamos el método “accionAnimar” que ya habíamos digitado en cada uno de los botones dentro del archivo “main.xml”. Dentro de este método vamos a evaluar que botón fue pulsado y que acción debe realizar. Todo esto con un “switch” como se ve en el siguiente código:</p>
<p>&nbsp;</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">logo.<span style="color: #006633;">setBackgroundResource</span><span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">ic_launcher</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> accionAnimar<span style="color: #009900;">&#40;</span><span style="color: #003399;">View</span> view<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
        Animation rotar <span style="color: #339933;">=</span> AnimationUtils.<span style="color: #006633;">loadAnimation</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>, R.<span style="color: #006633;">anim</span>.<span style="color: #006633;">rotar</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        rotar.<span style="color: #006633;">reset</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">switch</span> <span style="color: #009900;">&#40;</span>view.<span style="color: #006633;">getId</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">case</span> R.<span style="color: #006633;">id</span>.<span style="color: #006633;">btn_escalar</span><span style="color: #339933;">:</span>
			Animation escalar <span style="color: #339933;">=</span> AnimationUtils.<span style="color: #006633;">loadAnimation</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>, R.<span style="color: #006633;">anim</span>.<span style="color: #006633;">escalar</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        escalar.<span style="color: #006633;">reset</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			logo.<span style="color: #006633;">startAnimation</span><span style="color: #009900;">&#40;</span>escalar<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">case</span> R.<span style="color: #006633;">id</span>.<span style="color: #006633;">btn_rotar</span><span style="color: #339933;">:</span>
			Animation rotacion <span style="color: #339933;">=</span> AnimationUtils.<span style="color: #006633;">loadAnimation</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>, R.<span style="color: #006633;">anim</span>.<span style="color: #006633;">rotar</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	        rotacion.<span style="color: #006633;">reset</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			logo.<span style="color: #006633;">startAnimation</span><span style="color: #009900;">&#40;</span>rotacion<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">case</span> R.<span style="color: #006633;">id</span>.<span style="color: #006633;">btn_mezcla1</span><span style="color: #339933;">:</span>
			Animation mezcla1 <span style="color: #339933;">=</span> AnimationUtils.<span style="color: #006633;">loadAnimation</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>, R.<span style="color: #006633;">anim</span>.<span style="color: #006633;">mezcla1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			mezcla1.<span style="color: #006633;">reset</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			logo.<span style="color: #006633;">startAnimation</span><span style="color: #009900;">&#40;</span>mezcla1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">case</span> R.<span style="color: #006633;">id</span>.<span style="color: #006633;">btn_mover</span><span style="color: #339933;">:</span>
			Animation mover <span style="color: #339933;">=</span> AnimationUtils.<span style="color: #006633;">loadAnimation</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>, R.<span style="color: #006633;">anim</span>.<span style="color: #006633;">transladar</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			mover.<span style="color: #006633;">reset</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			texto.<span style="color: #006633;">startAnimation</span><span style="color: #009900;">&#40;</span>mover<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">case</span> R.<span style="color: #006633;">id</span>.<span style="color: #006633;">btn_trans</span><span style="color: #339933;">:</span>
			Animation transparente <span style="color: #339933;">=</span> AnimationUtils.<span style="color: #006633;">loadAnimation</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>, R.<span style="color: #006633;">anim</span>.<span style="color: #006633;">transparencia</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			transparente.<span style="color: #006633;">reset</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			texto.<span style="color: #006633;">startAnimation</span><span style="color: #009900;">&#40;</span>transparente<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">case</span> R.<span style="color: #006633;">id</span>.<span style="color: #006633;">btn_mezcla2</span><span style="color: #339933;">:</span>
			Animation mezcla2 <span style="color: #339933;">=</span> AnimationUtils.<span style="color: #006633;">loadAnimation</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>, R.<span style="color: #006633;">anim</span>.<span style="color: #006633;">mezcla2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		    mezcla2.<span style="color: #006633;">reset</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		    texto.<span style="color: #006633;">startAnimation</span><span style="color: #009900;">&#40;</span>mezcla2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>    
&nbsp;
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Perfecto, con este sencillo pero muy práctico código podremos aplicarle una animación a nuestros “Views” y darles ese toque personal y estético que queremos a nuestras aplicaciones, logrando que los usuarios de las mismas vean algo diferente y quieran cada vez mas sus dispositivos móviles.</p>
<p>Y como no iba a ser la excepción, te mostramos en video como funciona este código usando el emulador de Eclipse; en este caso ya no te mostraremos el desarrollo porque como habrás notado dejamos el código listo para que solo llegues lo copies y lo pegues.</p>
<p><iframe width="620" height="349" src="http://www.youtube.com/embed/videoseries?list=UUcOdo8mfXzKvvWHJwKHFjvA" frameborder="0" allowfullscreen></iframe></p>
<p>Espero que te sea de ayuda este tema para tus futuras aplicaciones, espera pronto nuevos temas sobre esta fabulosa plataforma Android.</p>
<p>Nota: Si detectas algún error en el código, en la explicación, escrito o en el video, por favor escríbenos y con mucho gusto la corregimos. Agradecemos tu ayuda.<br />
Nota 2: A partir de esta entrega dejare la mayor parte de código porque las próximas entregan serán cada vez mas extensas, además me han pedido mucho el código para copiarlo directamente en Eclipse, asi que ustedes son los que mandan.</p>
<img src="http://feeds.feedburner.com/~r/androideity/~4/iD6G9J0i85M" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://androideity.com/2012/05/20/animacion-de-views-en-android-usando-eclipse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://androideity.com/2012/05/20/animacion-de-views-en-android-usando-eclipse/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=animacion-de-views-en-android-usando-eclipse</feedburner:origLink></item>
		<item>
		<title>Tutorial de Widget – Tercera Parte!</title>
		<link>http://feedproxy.google.com/~r/androideity/~3/oYN1gSnlXeU/</link>
		<comments>http://androideity.com/2012/05/19/tutorial-de-widget-tercera-parte-3/#comments</comments>
		<pubDate>Sun, 20 May 2012 01:41:38 +0000</pubDate>
		<dc:creator>sebastiancipolat</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[appwidget]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[weather widget]]></category>
		<category><![CDATA[Widgets]]></category>

		<guid isPermaLink="false">http://androideity.com/?p=3416</guid>
		<description><![CDATA[<a href="http://androideity.com/2012/05/19/tutorial-de-widget-tercera-parte-3/"><img align="left" hspace="5" width="100" height="100" src="http://androideity.com/wp-content/uploads/2012/05/widgtuto31-150x150.png" class="alignleft wp-post-image tfe" alt="Tercera Parte" title="Tercera Parte" /></a>&#160; Hola el dia de hoy les traigo la tercera parte del tutorial sobre widgets. Con las cosas que aprendimos en las entregas anteriores (1 y 2) y con algunas cosas nuevas haremos un widget un poco mas complejo que mostrara el &#8230; <a href="http://androideity.com/2012/05/19/tutorial-de-widget-tercera-parte-3/">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://androideity.com/wp-content/uploads/2012/05/widgtuto31.png"><img class="aligncenter size-full wp-image-3420" title="Tercera Parte" src="http://androideity.com/wp-content/uploads/2012/05/widgtuto31.png" alt="Tercera Parte" width="578" height="280" /></a></p>
<p>&nbsp;</p>
<p>Hola el dia de hoy les traigo la tercera parte del tutorial sobre widgets.</p>
<p>Con las cosas que aprendimos en las entregas anteriores (<a title="link 1° parte" href="http://androideity.com/2012/03/10/aprende-a-crear-tus-propios-widget/">1</a> y <a title="link 2° parte " href="http://androideity.com/2012/03/25/tutorial-de-widget-segunda-parte/">2</a>) y con algunas cosas nuevas haremos un widget un poco mas complejo que mostrara el estado del clima, la temperatura actual, maxima y minima.<br />
La idea es que con lo que veamos hoy y en las proximas entregas<br />
este widget se valla volviendo mas complejo.</p>
<p><span id="more-3416"></span></p>
<p>Básicamente la idea es que se parezca al widget del clima del Nexus One.</p>
<p style="text-align: center;"><a href="http://androideity.com/wp-content/uploads/2012/05/widgets.png"><img class="aligncenter size-thumbnail wp-image-3417" style="margin-top: 5px; margin-bottom: 5px;" title="weather widget Nexus One" src="http://androideity.com/wp-content/uploads/2012/05/widgets-150x150.png" alt="wdiget Nexus one" width="150" height="150" /></a></p>
<p>&nbsp;</p>
<p>Una vez terminado debería verse así el texto mostrado dependera de cada caso:</p>
<p><a href="http://androideity.com/wp-content/uploads/2012/05/widget.png"><img class="aligncenter size-full wp-image-3455" title="widget" src="http://androideity.com/wp-content/uploads/2012/05/widget.png" alt="widget" width="372" height="170" /></a></p>
<p>&nbsp;</p>
<p>Nuestra app el dia de hoy hara lo siguiente se conectara atravez de internet al servicio de Yahoo Weather obtendra el RSS que nos devuelve en formato XML, parsearlo y obtener los datos que nos interesaran a nosotros, también posee un boton el cual al oprimirlo actualiza el contenido del widget en proximas entrega haremos que se actualice automáticamente cada cierto tiempo.</p>
<p>Antes de ver el codigo les comentare rapidamente como funciona este servicio de <strong><span style="color: #800080;">Yahoo</span></strong>:<br />
Este servicio permite tener informacion del clima de la ubicacion que se le pase como parametros<br />
Pueden consultar la documentacion sobre el api desde:</p>
<p><a title="api yahoo weather" href="http://developer.yahoo.com/weather/">http://developer.yahoo.com/weather/</a></p>
<p>No voy a explicar como funciona todo el servicio por que para esto esta la documentacion de Yahoo pero voy a aclarar alguno detalles.</p>
<p>Podemos obtener el RSS del clima de la ciudad autonoma de buenos aires atravez de este Link<br />
<a title="clima en buenos aires" href="http://weather.yahooapis.com/forecastrss?w=12813136&amp;u=c  "> http://weather.yahooapis.com/forecastrss?w=12813136&amp;u=c</a></p>
<p>Basicamente hay 2 parametros</p>
<p>http://weather.yahooapis.com/forecastrss?w=<span style="color: #0000ff;"><strong>location</strong></span>&amp;u=<strong><span style="color: #ff6600;">unit_temp</span></strong></p>
<p>w para WOEID este se puede obtener desde http://weather.yahoo.com/ la misma se encuentra en la URL<br />
por ej para la ciudad de mar del plata Argentina la url que nos manda es<br />
http://weather.yahoo.com/argentina/buenos-aires/mar-del-plata-466863/ entonces el WOEID seria 466863.</p>
<p>Luego el otro parametro es la unidad de temperatura en la que queremos los resultados.<br />
&amp;u=unit_temp<br />
si queremos que este en grados Celsius o Centigrados debemos usar &amp;u=c<br />
para Grados Farenheit podemos poner f si no colocamos este parametro tomara esta unidad por defecto.</p>
<p>Antes de continuar les recomiendo ver con detenimiento cual es el XML y los datos que nos procopiona este servicio.<br />
Ahora si manos a la obra:</p>
<p>Al proyecto lo llamare  widgetdelclima.</p>
<p>Tendra esta estructura:</p>
<p><a href="http://androideity.com/wp-content/uploads/2012/05/proy2.png"><img class="aligncenter size-full wp-image-3453" title="Proyecto Eclipse" src="http://androideity.com/wp-content/uploads/2012/05/proy2.png" alt="Proyecto Eclipse" width="272" height="556" /></a></p>
<p>Constara de 2 Clases Miwidget  que es la encargada de realizar todas las acciones y MyWeather que tendra la estructura de los nodos del XML que vamos a usar.</p>
<p>El diseño del Layout se lo define en main.xml</p>
<p><a href="http://androideity.com/wp-content/uploads/2012/05/layout1.png"><img class="size-full wp-image-3454 alignleft" title="layout" src="http://androideity.com/wp-content/uploads/2012/05/layout1.png" alt="layout" width="686" height="1072" /></a></p>
<p>Clase Myweather</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">test.widgetdelclima</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MyWeather <span style="color: #009900;">&#123;</span>
<span style="color: #003399;">String</span> city<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//ciudad</span>
<span style="color: #003399;">String</span> unit_temp<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//unidad de temperatura ºF / ºC</span>
<span style="color: #003399;">String</span> conditiontemp<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//Temperatura</span>
<span style="color: #003399;">String</span> YahooWcode<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//Codigo de Clima</span>
<span style="color: #003399;">String</span> MaxT<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//Temperatura Maxima</span>
<span style="color: #003399;">String</span> MinT<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//Temperatura Minima</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> toString<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">//retorna un string compuesto por todos los datos anteriores.</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>- &quot;</span>
<span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;city: &quot;</span> <span style="color: #339933;">+</span> city <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
<span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;unit_temp: &quot;</span><span style="color: #339933;">+</span>unit_temp<span style="color: #339933;">+</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
<span style="color: #339933;">+</span><span style="color: #0000ff;">&quot;YahooWcode&quot;</span><span style="color: #339933;">+</span>YahooWcode<span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
<span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;Condition: &quot;</span> <span style="color: #339933;">+</span> conditiontemp <span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Archivo AndroidManifest.xml</p>
<p style="text-align: center;"><a href="http://androideity.com/wp-content/uploads/2012/05/amanifest1.png"><img class="size-full wp-image-3464 aligncenter" title="archivo manifest" src="http://androideity.com/wp-content/uploads/2012/05/amanifest1.png" alt="archivo manifest" width="670" height="373" /></a></p>
<p style="text-align: justify;">XML widget_provider.xml</p>
<p style="text-align: justify;"><a href="http://androideity.com/wp-content/uploads/2012/05/widrovider.png"><img class="aligncenter size-full wp-image-3465" title="widget provider" src="http://androideity.com/wp-content/uploads/2012/05/widrovider.png" alt="widget provider" width="681" height="154" /></a></p>
<p style="text-align: justify;">A continuaciòn veremos el contenido de la otra clase colocare comentarios para explicar el funcionamiento:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">/******************************************************************
*
* WIDGET DEL CLIMA
*
* AUTOR: SEBASTIAN CIPOLAT
* BUENOS AIRES ARGENTINA 2012
*
* VERSION PARA ANDROIDEITY
*
*******************************************************************/</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Miwidget <span style="color: #000000; font-weight: bold;">extends</span> AppWidgetProvider<span style="color: #009900;">&#123;</span>
&nbsp;
<span style="color: #003399;">Document</span> weatherDoc <span style="color: #339933;">;</span>
MyWeather weatherResult<span style="color: #339933;">;</span>
<span style="color: #003399;">String</span> weatherString <span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span> ACTION_update <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;force_update&quot;</span><span style="color: #339933;">;</span>
@Override
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> onUpdate<span style="color: #009900;">&#40;</span><span style="color: #003399;">Context</span> context, AppWidgetManager appWidgetManager,
<span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> appWidgetIds<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/*Cada vez que se ejecute onUpdate ejecuta get_data qeu se encargara de tomar los datos de internet
* y devolverlos como un objeto Document.
*/</span>
&nbsp;
get_data<span style="color: #009900;">&#40;</span>context , appWidgetManager<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> get_data<span style="color: #009900;">&#40;</span><span style="color: #003399;">Context</span> ctx , AppWidgetManager appwidg<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
weatherString<span style="color: #339933;">=</span> QueryYahooWeather<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;468739&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//WOEID de Buenos Aires 468739</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/*Si weatherString retorna un String diferente a null
significa que QueryYahooWeather devolvio algun dato por lo que podemos continuar en caso de que fuese null
mostrara error y pasara a actualizarWidget un parametro 0 para que muestre error
*/</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>weatherString<span style="color: #339933;">!=</span><span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">//convertimos weatherString a Document</span>
weatherDoc <span style="color: #339933;">=</span> convertStringToDocument<span style="color: #009900;">&#40;</span>weatherString<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>weatherDoc<span style="color: #339933;">!=</span><span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #666666; font-style: italic;">//si todo estuvo bien parseamos el documento</span>
&nbsp;
weatherResult<span style="color: #339933;">=</span> parseWeather<span style="color: #009900;">&#40;</span>weatherDoc<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>weatherResult<span style="color: #339933;">!=</span><span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">/*Si llegamos hasta aca significa que todo funciono bien y
* pasamos a actualizarWidget las variables a mostrar.
*/</span>
actualizarWidget<span style="color: #009900;">&#40;</span>ctx, appwidg, weatherResult.<span style="color: #006633;">city</span>,weatherResult.<span style="color: #006633;">conditiontemp</span>,weatherResult.<span style="color: #006633;">unit_temp</span>
,weatherResult.<span style="color: #006633;">MaxT</span>,weatherResult.<span style="color: #006633;">MinT</span>,weatherResult.<span style="color: #006633;">YahooWcode</span>,<span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//actualizarWidget(ctx, appwidg, ciudad,temp,unit_temp,1);</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #000000; font-weight: bold;">else</span><span style="color: #009900;">&#123;</span>
Log.<span style="color: #006633;">e</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Error obteniendo informacion&quot;</span>, <span style="color: #0000ff;">&quot;:X&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//si no muestro error</span>
<span style="color: #666666; font-style: italic;">//actualizarWidget(ctx, appwidg, &quot;Error&quot;,&quot;E&quot;,&quot;r&quot;,0);</span>
<span style="color: #666666; font-style: italic;">//como hubo algun error no pasamos ningun parametro excepto el erro_flag</span>
actualizarWidget<span style="color: #009900;">&#40;</span>ctx, appwidg,<span style="color: #000066; font-weight: bold;">null</span>,<span style="color: #000066; font-weight: bold;">null</span>,<span style="color: #000066; font-weight: bold;">null</span>,<span style="color: #000066; font-weight: bold;">null</span>,<span style="color: #000066; font-weight: bold;">null</span>,<span style="color: #000066; font-weight: bold;">null</span>,<span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Realiza una peticion mediante GET al servicio de Yahoo pasando los parametros de la ciudad woid
* y unidad de temperatura.
* Retorna un String con todo el XML que luego se utilizara para extraer los datos.
*/</span>
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> QueryYahooWeather<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> woid<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
<span style="color: #003399;">String</span> qResult <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #003399;">String</span> queryString <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;http://weather.yahooapis.com/forecastrss?w=&quot;</span><span style="color: #339933;">+</span>woid<span style="color: #339933;">+</span><span style="color: #0000ff;">&quot;&amp;amp;u=c&quot;</span><span style="color: #339933;">;</span>
&nbsp;
HttpClient httpClient <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DefaultHttpClient<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
HttpGet httpGet <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> HttpGet<span style="color: #009900;">&#40;</span>queryString<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
HttpEntity httpEntity <span style="color: #339933;">=</span> httpClient.<span style="color: #006633;">execute</span><span style="color: #009900;">&#40;</span>httpGet<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getEntity</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>httpEntity <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
<span style="color: #003399;">InputStream</span> inputStream <span style="color: #339933;">=</span> httpEntity.<span style="color: #006633;">getContent</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003399;">Reader</span> in <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">InputStreamReader</span><span style="color: #009900;">&#40;</span>inputStream<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003399;">BufferedReader</span> bufferedreader <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BufferedReader</span><span style="color: #009900;">&#40;</span>in<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
StringBuilder stringBuilder <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> StringBuilder<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003399;">String</span> stringReadLine <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//imprime todo el xml en qResult</span>
<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>stringReadLine <span style="color: #339933;">=</span> bufferedreader.<span style="color: #006633;">readLine</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
stringBuilder.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span>stringReadLine <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
qResult <span style="color: #339933;">=</span> stringBuilder.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>ClientProtocolException e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Log.<span style="color: #006633;">e</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;error! QueryYahooWeather&quot;</span>, <span style="color: #0000ff;">&quot; :/&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">IOException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Log.<span style="color: #006633;">e</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;error! QueryYahooWeather&quot;</span>, <span style="color: #0000ff;">&quot; :/&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">return</span> qResult<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* En base al parametro src el cual es todo el xml devuelto por yahoo
* se lo pasa a un objeto del tipo Document que luego se utilizara para poder
* parsear del xml lo que nos interesa
*/</span>
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Document</span> convertStringToDocument<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> src<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
<span style="color: #003399;">Document</span> dest <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
&nbsp;
DocumentBuilderFactory dbFactory <span style="color: #339933;">=</span> DocumentBuilderFactory.<span style="color: #006633;">newInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
DocumentBuilder parser<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
parser <span style="color: #339933;">=</span> dbFactory.<span style="color: #006633;">newDocumentBuilder</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
dest <span style="color: #339933;">=</span> parser.<span style="color: #006633;">parse</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">ByteArrayInputStream</span><span style="color: #009900;">&#40;</span>src.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>ParserConfigurationException e1<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
e1.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>SAXException e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">IOException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">return</span> dest<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Este metodo es el mas importante se encargara de 'parsear' el objeto Document y extrae lo que nos interesa
* y asignarlo a las variables correspondientes.
* retorna un objeto weatherResult del cual extraeremos los datos necesarios.
*/</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">private</span> MyWeather parseWeather<span style="color: #009900;">&#40;</span><span style="color: #003399;">Document</span> srcDoc<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">//creamos un objeto myWeather</span>
MyWeather myWeather <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MyWeather<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* XML &amp;lt;yweather:location city=&quot;Buenos Aires&quot; region=&quot;&quot; country=&quot;Argentina&quot;/&amp;gt;
* Del nodo yweather:location extrae el valor del atributo city
*/</span>
Node locationNode <span style="color: #339933;">=</span> srcDoc.<span style="color: #006633;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;yweather:location&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">item</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
myWeather.<span style="color: #006633;">city</span> <span style="color: #339933;">=</span> locationNode.<span style="color: #006633;">getAttributes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getNamedItem</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;city&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getNodeValue</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* XML &amp;lt;yweather:units temperature=&quot;C&quot; distance=&quot;km&quot; pressure=&quot;mb&quot; speed=&quot;km/h&quot;/&amp;gt;
* Del nodo yweather:units extrae el valor atributo temperature
*/</span>
Node unittempNode <span style="color: #339933;">=</span> srcDoc.<span style="color: #006633;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;yweather:units&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">item</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
myWeather.<span style="color: #006633;">unit_temp</span><span style="color: #339933;">=</span> unittempNode.<span style="color: #006633;">getAttributes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getNamedItem</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;temperature&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getNodeValue</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/*XML &amp;lt;yweather:condition text=&quot;Cloudy&quot; code=&quot;26&quot; temp=&quot;16&quot; date=&quot;Sat, 19 May 2012 7:00 pm ART&quot;/&amp;gt;
* Obtiene el valor de atributo temp el cual es la temperatura actual y el codigo code que utilizaremos luego
* Tambien se observa que en text se encuetra la descripcion del clima en este caso nublado */</span>
&nbsp;
Node conditionNode <span style="color: #339933;">=</span> srcDoc.<span style="color: #006633;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;yweather:condition&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">item</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
myWeather.<span style="color: #006633;">conditiontemp</span> <span style="color: #339933;">=</span> conditionNode.<span style="color: #006633;">getAttributes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getNamedItem</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;temp&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getNodeValue</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
myWeather.<span style="color: #006633;">YahooWcode</span><span style="color: #339933;">=</span> conditionNode.<span style="color: #006633;">getAttributes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getNamedItem</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;code&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getNodeValue</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/*XML &amp;lt;yweather:forecast day=&quot;Sat&quot; date=&quot;19 May 2012&quot; low=&quot;14&quot; high=&quot;17&quot; text=&quot;Showers Late&quot; code=&quot;45&quot;/&amp;gt;
*
* Toma los valores low y high el cual son las temperaturas maxima y minima del dia.
*
* */</span>
&nbsp;
Node forecastNode <span style="color: #339933;">=</span> srcDoc.<span style="color: #006633;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;yweather:forecast&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">item</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
myWeather.<span style="color: #006633;">MinT</span> <span style="color: #339933;">=</span> forecastNode.<span style="color: #006633;">getAttributes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getNamedItem</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;low&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getNodeValue</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
myWeather.<span style="color: #006633;">MaxT</span> <span style="color: #339933;">=</span> forecastNode.<span style="color: #006633;">getAttributes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getNamedItem</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;high&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getNodeValue</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">/* A modo de control imprimo en el Logcat el contenido del objeto myWeather.toString*/</span>
&nbsp;
Log.<span style="color: #006633;">e</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;-------&quot;</span>, <span style="color: #0000ff;">&quot;---------------&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Log.<span style="color: #006633;">e</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;XML yw&quot;</span>, myWeather.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Devolvemos myWeather el cual se utilizara luego.</span>
<span style="color: #000000; font-weight: bold;">return</span> myWeather<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Este es el metodo que se encargara de actualizar el widget de la misma forma que vimos en el segunda parte del tutorial
* se les pasan por parametros los valores que mostrara el temperatura , ciudad, temperatura maxy , min y un ultimo parametro
* error_flag el cual se utiliza para mostrar error.
* Tambien se define el PendingIntent que utilizaremos para actualizar el contenido el widget.
**/</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> actualizarWidget<span style="color: #009900;">&#40;</span><span style="color: #003399;">Context</span> context,AppWidgetManager appWidgetManager, <span style="color: #003399;">String</span> city,<span style="color: #003399;">String</span> temp,
<span style="color: #003399;">String</span> unit_tmp,<span style="color: #003399;">String</span> tmp_max,<span style="color: #003399;">String</span> tmp_min,<span style="color: #003399;">String</span> yahoowcode,<span style="color: #000066; font-weight: bold;">int</span> error_flag<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
<span style="color: #000066; font-weight: bold;">int</span> img_var<span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">/****************************
* int error_flag
* 1 OK
* 0 Error
*****************************/</span>
RemoteViews remoteViews<span style="color: #339933;">;</span>
&nbsp;
ComponentName thisWidget<span style="color: #339933;">;</span>
&nbsp;
remoteViews <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> RemoteViews<span style="color: #009900;">&#40;</span>context.<span style="color: #006633;">getPackageName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, R.<span style="color: #006633;">layout</span>.<span style="color: #006633;">main</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
thisWidget <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ComponentName<span style="color: #009900;">&#40;</span>context, Miwidget.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>error_flag<span style="color: #339933;">==</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #666666; font-style: italic;">// Todo estuvo bien</span>
<span style="color: #666666; font-style: italic;">/*En base al yahoo code determineimg2use nos retorna el id de la imagen a mostrar*/</span>
img_var<span style="color: #339933;">=</span>determineimg2use<span style="color: #009900;">&#40;</span><span style="color: #003399;">Integer</span>.<span style="color: #006633;">valueOf</span><span style="color: #009900;">&#40;</span>yahoowcode<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>img_var<span style="color: #339933;">!=-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>
remoteViews.<span style="color: #006633;">setImageViewResource</span><span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">id</span>.<span style="color: #006633;">clima_img</span>,img_var<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">else</span><span style="color: #666666; font-style: italic;">//img var=-1 hubo algun error mostramos la imagen unknown</span>
remoteViews.<span style="color: #006633;">setImageViewResource</span><span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">id</span>.<span style="color: #006633;">clima_img</span>,R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">unknown</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Asignamos a cada elemento del lyput el texto correspondiente</span>
remoteViews.<span style="color: #006633;">setTextViewText</span><span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">id</span>.<span style="color: #006633;">temp</span>,temp<span style="color: #339933;">+</span><span style="color: #0000ff;">&quot;º&quot;</span><span style="color: #339933;">+</span>unit_tmp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
remoteViews.<span style="color: #006633;">setTextViewText</span><span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">id</span>.<span style="color: #006633;">max_min</span>,maxT<span style="color: #339933;">+</span><span style="color: #0000ff;">&quot;º&quot;</span><span style="color: #339933;">+</span>unit_tmp<span style="color: #339933;">+</span><span style="color: #0000ff;">&quot; &quot;</span><span style="color: #339933;">+</span>minT<span style="color: #339933;">+</span><span style="color: #0000ff;">&quot;º&quot;</span><span style="color: #339933;">+</span>unit_tmp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
remoteViews.<span style="color: #006633;">setTextViewText</span><span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">id</span>.<span style="color: #006633;">city</span>,city<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #000000; font-weight: bold;">else</span><span style="color: #009900;">&#123;</span><span style="color: #666666; font-style: italic;">//error_flag=0 mostramos mensaje de error</span>
&nbsp;
Toast.<span style="color: #006633;">makeText</span><span style="color: #009900;">&#40;</span>context,<span style="color: #0000ff;">&quot;Error: <span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">+</span><span style="color: #0000ff;">&quot;Verifique su conexion a internet <span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">+</span><span style="color: #0000ff;">&quot;Presione actualizar para intentarlo de nuevo.&quot;</span>, Toast.<span style="color: #006633;">LENGTH_LONG</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
remoteViews.<span style="color: #006633;">setImageViewResource</span><span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">id</span>.<span style="color: #006633;">clima_img</span>,R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">unknown</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
remoteViews.<span style="color: #006633;">setTextViewText</span><span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">id</span>.<span style="color: #006633;">temp</span>,<span style="color: #0000ff;">&quot;- - -&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
remoteViews.<span style="color: #006633;">setTextViewText</span><span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">id</span>.<span style="color: #006633;">city</span>,<span style="color: #0000ff;">&quot;ERROR&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
remoteViews.<span style="color: #006633;">setTextViewText</span><span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">id</span>.<span style="color: #006633;">max_min</span>,<span style="color: #0000ff;">&quot;No se obtuvieron datos&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Creamos un intent a nuestra propia clase como vimos en la entrega anterior</span>
Intent intent <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Intent<span style="color: #009900;">&#40;</span>context, Miwidget.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//seleccionamos la accion ACTION_cambiarlayout</span>
intent.<span style="color: #006633;">setAction</span><span style="color: #009900;">&#40;</span>ACTION_update<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
PendingIntent pendingIntent <span style="color: #339933;">=</span> PendingIntent.<span style="color: #006633;">getBroadcast</span><span style="color: #009900;">&#40;</span>context, <span style="color: #cc66cc;">0</span>, intent, <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
remoteViews.<span style="color: #006633;">setOnClickPendingIntent</span><span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">id</span>.<span style="color: #006633;">update</span>, pendingIntent<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
appWidgetManager.<span style="color: #006633;">updateAppWidget</span><span style="color: #009900;">&#40;</span>thisWidget, remoteViews<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
@Override
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> onReceive<span style="color: #009900;">&#40;</span><span style="color: #003399;">Context</span> context, Intent intent<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">//Controlamos que la accion recibida sea la nuestra</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>intent.<span style="color: #006633;">getAction</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span>ACTION_update<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
Log.<span style="color: #006633;">e</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;MANUAL UPDATE&quot;</span>,<span style="color: #0000ff;">&quot; ACTIVATED&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//actualizamos el widget.</span>
AppWidgetManager widgetManager <span style="color: #339933;">=</span>AppWidgetManager.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span>context<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
get_data<span style="color: #009900;">&#40;</span>context , widgetManager<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">onReceive</span><span style="color: #009900;">&#40;</span>context, intent<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Este metodo  lo que hace es en base al yahoowcode retorna el id de la imagen a mostrar.</span>
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">int</span> determineimg2use<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> yahoowcode<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
<span style="color: #000066; font-weight: bold;">int</span> finalcode<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">switch</span><span style="color: #009900;">&#40;</span>yahoowcode<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img03</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">4</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img03</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">5</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img07</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">6</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img06</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">7</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img06</span><span style="color: #339933;">;;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">8</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img10</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">9</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img12</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img10</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">11</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img12</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">12</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img12</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">13</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img12</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">14</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img15</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">15</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img15</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">16</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img15</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">17</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img18</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">18</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img10</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">19</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img21</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">20</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img22</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">21</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img22</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">22</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img21</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">23</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img26</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">24</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img24</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">25</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img25</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">26</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img26</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">27</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img27</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">28</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img28</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">29</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img29</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">30</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img30</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">31</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img31</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">32</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img32</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">33</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img33</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">34</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img34</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">35</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img18</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">36</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img36</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">37</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img03</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">38</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img03</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">39</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img03</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">40</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img40</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">41</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img15</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">42</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img13</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">43</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img15</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">44</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img26</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">45</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img40</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">46</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img07</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">47</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> R.<span style="color: #006633;">drawable</span>.<span style="color: #006633;">img39</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">3200</span><span style="color: #339933;">:</span> finalcode<span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">default</span><span style="color: #339933;">:</span>
finalcode<span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">return</span> finalcode<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Algunas aclaraciones:</p>
<p>Cuando halla algun error y a actualizarWidget() le pasemos el parametro 0 a error_flag  el widget se vera de esta forma</p>
<p><a href="http://androideity.com/wp-content/uploads/2012/05/error.png"><img class="aligncenter size-medium wp-image-3470" title="error" src="http://androideity.com/wp-content/uploads/2012/05/error-300x140.png" alt="error" width="300" height="140" /></a></p>
<p>Si presionamos la flecha realizaremos una nueva peticion por lo que si todo funciona bien debera mostrar los datos de la forma normal</p>
<p>El metodo que utilizo para obtener los datos del xml puede no ser el optimo para todos los casos.</p>
<p>El tiempo que tarde en obtener los datos dependerá de la conexión a Internet.</p>
<p>En el metodo determineimg2use lo que hice  es tratar de resumir los 48 codigos de condicion y tratar de agruparlos a los mas comunes por lo que puede ser que</p>
<p>no sea de todo exacto.</p>
<p>Respecto de las imagenes las he sacado de esta pagina <a href="http://iconbest.com/2009/01/07/waether-iconset/">http://iconbest.com/2009/01/07/waether-iconset/</a>.</p>
<p>En este caso he colocado las imagenes en el directorio res drawable ya que las que estaban en el xml que nos devuelve yahoo no son muy lindas.</p>
<p>Otra cosa nueva que hay en el codigo es el de poder cambiar la imagen que mostrara un imageview</p>
<p>remoteViews.setImageViewResource(<span style="color: #99cc00;"><strong>R.id.clima_img</strong></span>,R.drawable.unknown);</p>
<p>al cual hay que suministrarle el id de un Imageview y el id de la imagen a mostrar.</p>
<p>Para ir terminando hoy hemos hecho un app widget bastante complejo como los que se pueden encontrar en el market (google play store)  este puede variarse y mostrar cualquier dato proveniente de un webservice siempre que devuelva la informacion en xml por lo que les puede ser de ayuda para futuros proyectos.</p>
<p>Pueden descargar el proyecto para realizar sus propias pruebas desde <strong><span style="color: #ff6600;"><a title="Link de descarga" href="http://code.google.com/p/sebastian-cipolat-android-project/downloads/detail?name=widgetdelclima.rar&amp;can=2&amp;q=#makechanges">aqui</a></span></strong>.</p>
<p>Espero que les halla gustado en proximas entregas veremos como hacerlo mas complejo.</p>
<p>Como siempre si tienen alguna consulta o sugerencia utilizen el cuadro de comentarios de bajo.</p>
<p>Hasta la proxima!.</p>
<p>Sebastian.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src="http://feeds.feedburner.com/~r/androideity/~4/oYN1gSnlXeU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://androideity.com/2012/05/19/tutorial-de-widget-tercera-parte-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://androideity.com/2012/05/19/tutorial-de-widget-tercera-parte-3/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=tutorial-de-widget-tercera-parte-3</feedburner:origLink></item>
		<item>
		<title>Asiste a la reunión Mayo 2012 Cocoaheads y Androideity</title>
		<link>http://feedproxy.google.com/~r/androideity/~3/k1n5jlAJ2qA/</link>
		<comments>http://androideity.com/2012/05/15/asiste-a-la-reunion-mayo-2012-cocoaheads-y-androideity/#comments</comments>
		<pubDate>Tue, 15 May 2012 20:11:09 +0000</pubDate>
		<dc:creator>Condesa</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[conferencias]]></category>
		<category><![CDATA[conociendo Android]]></category>
		<category><![CDATA[desarrollo en android]]></category>
		<category><![CDATA[eventos]]></category>

		<guid isPermaLink="false">http://androideity.com/?p=3442</guid>
		<description><![CDATA[<a href="http://androideity.com/2012/05/15/asiste-a-la-reunion-mayo-2012-cocoaheads-y-androideity/"><img align="left" hspace="5" width="100" height="100" src="http://androideity.com/wp-content/uploads/2012/05/cocoaheads-150x150.png" class="alignleft wp-post-image tfe" alt="" title="Cocoaheads y Androideity" /></a>En esta ocasión es para mí un placer invitarlos a una reunión que tendremos este sábado 19 de mayo en Ciudad de México con apoyo de la comunidad de Cocoa Heads México que se dedican al desarrollo en iOS y nuestra comunidad. &#8230; <a href="http://androideity.com/2012/05/15/asiste-a-la-reunion-mayo-2012-cocoaheads-y-androideity/">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a title="Cocoaheads y Androideity" href="http://androideity.com/wp-content/uploads/2012/05/cocoaheads.png" target="_blank"><img class="aligncenter size-full wp-image-3443" style="margin-top: 10px; margin-bottom: 10px;" title="Cocoaheads y Androideity" src="http://androideity.com/wp-content/uploads/2012/05/cocoaheads.png" alt="" width="578" height="280" /></a></p>
<p>En esta ocasión es para mí un placer invitarlos a una reunión que tendremos este sábado 19 de mayo en Ciudad de México con apoyo de la comunidad de <strong><a href="http://cocoaheads.org/mx/MexicoCity/index.html" target="_blank">Cocoa Heads México</a></strong> que se dedican al desarrollo en iOS y nuestra comunidad.</p>
<p>Con la finalidad de invitar a los chavos interesados en el desarrollo de aplicaciones móviles y ser parte de este nuevo mercado emergente en nuestro país, estamos organizando varias charlas que te ayuden a dar el salto que necesitas para aprender y para la gente que ya está haciendo cosas pueda obtener un feedback con el contenido que venimos a compartir.</p>
<p><span id="more-3442"></span>Lo genial de la modalidad de estas reuniones es que si bien se organizan charlas, también tendrás un espacio para platicar con otros desarrolladores acerca de los proyectos en los que te encuentras trabajando y aclarar dudas que tengas, intercambiar experiencias, etc.</p>
<p>El enfoque no es totalmente Android, sin embargo, creo conveniente también mirar hacia otras plataformas y conocer en qué se programa, quién quita y también estás interesado en aprender de iOS. ;D</p>
<p>Este evento será el Sábado 19 de mayo de 10:00 AM a 5:00 PM en la ciudad de México, en las Oficinas Raku ubicadas en Paseo de la Reforma 107, piso 5 despacho 502.</p>
<p>Por cuestiones de las instalaciones, el cupo es limitado a un número específico de personas por lo que si estás interesado en asistir no esperes más y regístrate <a href="https://cocoaheadsmx.stagehq.com/events/1469" target="_blank">aquí</a>.</p>
<p>Espero que aproveches al máximo el evento para aprender más sobre desarrollo móvil.</p>
<p>&nbsp;</p>
<p style="text-align: center;"><strong>¡Corre la voz!</strong></p>
<p style="text-align: center;">
<img src="http://feeds.feedburner.com/~r/androideity/~4/k1n5jlAJ2qA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://androideity.com/2012/05/15/asiste-a-la-reunion-mayo-2012-cocoaheads-y-androideity/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://androideity.com/2012/05/15/asiste-a-la-reunion-mayo-2012-cocoaheads-y-androideity/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=asiste-a-la-reunion-mayo-2012-cocoaheads-y-androideity</feedburner:origLink></item>
		<item>
		<title>Administra tus repositorios con Subeclipse</title>
		<link>http://feedproxy.google.com/~r/androideity/~3/TC-dMTPpn3s/</link>
		<comments>http://androideity.com/2012/05/15/administra-tus-repositorios-con-subeclipse/#comments</comments>
		<pubDate>Tue, 15 May 2012 15:56:27 +0000</pubDate>
		<dc:creator>Condesa</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[desarrollo en android]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[herramientas]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://androideity.com/?p=3411</guid>
		<description><![CDATA[<a href="http://androideity.com/2012/05/15/administra-tus-repositorios-con-subeclipse/"><img align="left" hspace="5" width="100" height="100" src="http://androideity.com/wp-content/uploads/2012/05/subeclipse-150x150.png" class="alignleft wp-post-image tfe" alt="" title="Subeclipse" /></a>Si ya llevas tiempo en esto del desarrollo, sin importar la plataforma, sabrás la importancia de trabajar con herramientas que nos ayuden a llevar el control de las versiones de un proyecto (cuestión muy importante cuando trabajamos en equipo). La &#8230; <a href="http://androideity.com/2012/05/15/administra-tus-repositorios-con-subeclipse/">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a title="Subeclipse" href="http://androideity.com/wp-content/uploads/2012/05/subeclipse.png" target="_blank"><br />
<img class="aligncenter size-full wp-image-3431" style="margin-top: 10px; margin-bottom: 10px;" title="Subeclipse" src="http://androideity.com/wp-content/uploads/2012/05/subeclipse.png" alt="" width="578" height="280" /></a></p>
<p>Si ya llevas tiempo en esto del desarrollo, sin importar la plataforma, sabrás la importancia de trabajar con herramientas que nos ayuden a llevar el control de las versiones de un proyecto (cuestión muy importante cuando trabajamos en equipo).</p>
<p>La herramienta con la que he trabajado en muchas ocasiones es <strong>SVN</strong> que viene del término <strong>Subversion</strong> y se trata de un software (<em>open source</em>) de sistema de control de versiones. Dentro de sus características podemos mencionar:</p>
<ul>
<li>Un repositorio remoto donde se alojan las copias y revisiones comunes.</li>
<li>Contamos con una copia local donde podemos trabajar de forma independiente y cuando creamos conveniente, podemos mandar esta copia al repositorio remoto y el sistema se encargará de verificar que no existan conflictos entre las diferentes copias y así tener siempre la &#8220;versión estable y final&#8221; cada vez que un miembro del equipo actualice.</li>
<li>Permite ver una muestra de cambios entre diferentes versiones, esto en los archivos de clases y archivos similares.</li>
</ul>
<p>Si bien podemos utilizar SVN como cualquier otro programa en nuestra computadora, también existe un plugin que nos permite vincularlo a nuestro Eclipse y trabajar de forma más cómoda con las versiones. Esto es precisamente lo que vengo a compartirte en este post.</p>
<p><span id="more-3411"></span>El plugin en cuestión se llama <strong>Subeclipse</strong>, un proyecto de <a href="http://subclipse.tigris.org" target="_blank">Tigris.org</a> que dota a nuestro Eclipse IDE con la capacidad de soportar las funciones de SVN directamente sobre los proyectos que tengamos en nuestro Workspace.</p>
<p>En el <a href="http://subclipse.tigris.org/servlets/ProjectProcess?pageID=p4wYuA" target="_blank">sitio del proyecto</a> podrás checar qué versión de Subversion, de Eclipse y del plugin puedes utilizar en conjunto para que no tengas ningún problema de compatibilidad.</p>
<p>Para conocer la versión de tu Eclipse basta con ir a la opción <em>Help &gt; About Eclipse SDK</em>:</p>
<p style="text-align: center;"><a title="Subeclipse plugin" href="http://androideity.com/wp-content/uploads/2012/05/subeclipse01.png" target="_blank"><img class="aligncenter  wp-image-3434" style="margin-top: 10px; margin-bottom: 10px;" title="Subeclipse plugin" src="http://androideity.com/wp-content/uploads/2012/05/subeclipse01.png" alt="" width="491" height="303" /></a></p>
<p>En mi caso, he elegido la versión 1.6 de Subeclipse.</p>
<p style="text-align: center;"><a title="Subeclipse plugin" href="http://androideity.com/wp-content/uploads/2012/05/subeclipse02.png" target="_blank"><img class="aligncenter  wp-image-3435" style="margin-top: 10px; margin-bottom: 10px;" title="Subeclipse plugin" src="http://androideity.com/wp-content/uploads/2012/05/subeclipse02.png" alt="" width="526" height="66" /></a></p>
<p>Para instalarlo, me voy a la opción <em>Help &gt; Install new software</em> de Eclipse y damos clic sobre el botón <em>Add&#8230;</em> donde colocaremos la URL que corresponde a <em>Eclipse update site URL</em> de la imagen anterior y de preferencia un nombre que haga referencia a lo que estamos instalando:</p>
<p style="text-align: center;"><a title="Subeclipse plugin" href="http://androideity.com/wp-content/uploads/2012/05/subeclipse03.png" target="_blank"><img class="aligncenter size-full wp-image-3436" style="margin-top: 10px; margin-bottom: 10px;" title="Subeclipse plugin" src="http://androideity.com/wp-content/uploads/2012/05/subeclipse03.png" alt="" width="494" height="197" /></a></p>
<p>Posteriormente elegiremos las herramientas que necesitemos de las que nos da la opción de instalar. Al momento de seleccionar alguna de ellas se nos muestra la información detallada del <em>feature</em> para que nos sea más fácil elegir. Yo he seleccionado las tres y doy clic en <em>Next &gt;</em>. Cuando la instalación haya finalizado es necesario reiniciar Eclipse.</p>
<p>Siempre que instalemos un nuevo plugin o herramienta a nuestro IDE, es importante hacer un test rápido para saber que todo salió bien.</p>
<p>Con este plugin tendremos la opción de abrir la perspectiva de SVN para ver nuestros proyectos y administrar nuestros repositorios de forma más cómoda. Para irnos a esta perspectiva damos clic en <em>Window &gt; Open perspective &gt; Other &gt; SVN Repository Exploring</em>.</p>
<p style="text-align: center;"><a title="Subeclipse plugin" href="http://androideity.com/wp-content/uploads/2012/05/subeclipse04.png" target="_blank"><img class="aligncenter  wp-image-3438" style="margin-top: 10px; margin-bottom: 10px;" title="Subeclipse plugin" src="http://androideity.com/wp-content/uploads/2012/05/subeclipse04.png" alt="" width="541" height="278" /></a></p>
<p>Dentro de la pestaña <em>SVN Repositories</em> se irán enlistando los repositorios que vayamos agregando. En la pestaña <em>SVN Annotate</em> podemos accesar a los comentarios o anotaciones que se le haya hecho a alguno de los archivos del repositorio que nos hayamos descargado previamente.</p>
<p>Para agregar un repositorio nuevo basta con dar clic sobre el área blanca de <em>SVN Repositories &gt; New &gt; Repository Location</em>, escribimos la URL y damos clic en <em>Finish</em>.</p>
<p style="text-align: center;"><a title="Subeclipse plugin" href="http://androideity.com/wp-content/uploads/2012/05/subeclipse05.png" target="_blank"><img class="aligncenter size-full wp-image-3437" style="margin-top: 10px; margin-bottom: 10px;" title="Subeclipse plugin" src="http://androideity.com/wp-content/uploads/2012/05/subeclipse05.png" alt="" width="510" height="291" /></a></p>
<p>Una vez teniendo un repositorio agregado podemos navegar entre su contenido para ahora sí descargarnos directamente proyectos Android (u otro tipo de proyectos) a nuestro Workspace. Sobre el directorio de nuestro interés damos clic derecho y seleccionamos la opción <em>Checkout&#8230;</em> que nos llevará a un wizzard en dónde escribiremos el nombre con el que se descargará ese proyecto dentro del Workspace.</p>
<p style="text-align: center;"><a title="Subeclipse plugin" href="http://androideity.com/wp-content/uploads/2012/05/subeclipse06.png" target="_blank"><img class="aligncenter size-full wp-image-3439" style="margin-top: 10px; margin-bottom: 10px;" title="Subeclipse plugin" src="http://androideity.com/wp-content/uploads/2012/05/subeclipse06.png" alt="" width="525" height="514" /></a></p>
<p>Al dar clic en <em>Finish</em> nos descargará el proyecto dentro de la ubicación por default de nuestro Workspace. Si necesitas descargarte el proyecto dentro de otro directorio, da clic en <em>Next</em> ya que en la siguiente ventana es en donde podrás cambiar la ubicación.</p>
<p>Al finalizar la descarga, cambia de perspectiva a la de Java y en tu <em>Package Explorer</em> podrás ver ya el proyecto descargado del repo. De esta forma nos es bastante sencillo empezar a trabajar sobre el código, hacer modificaciones y actualizar el proyecto en el repositorio que compartimos con nuestros miembros de equipo.</p>
<p>En la web suelo encontrar algunos proyectos de librerías que liberan su código fuente proporcionándote una URL de su repositorio. Con este plugin podrás descargarte dichos proyectos de forma rápida y sencilla y poder navegar entre el código.</p>
<p>Hay veces en las que estos proyectos se liberan únicamente bajo permisos de lectura, así que no te será posible mandar los cambios que puedas llegar a hacerles a las clases del proyecto.</p>
<p>Por ejemplo, a continuación te muestro cómo se ve el proyecto que corresponde al código fuente de la librería <em>OpenYouTubeActivity</em> del cuál platiqué en mi <a title="Reproducir videos de Youtube desde tu app Android" href="http://androideity.com/2012/05/13/reproducir-videos-de-youtube-desde-tu-app-android/" target="_blank">post anterior</a>.</p>
<p style="text-align: center;"><a title="Subeclipse plugin" href="http://androideity.com/wp-content/uploads/2012/05/subeclipse07.png" target="_blank"><img class="aligncenter size-full wp-image-3440" style="margin-top: 10px; margin-bottom: 10px;" title="Subeclipse plugin" src="http://androideity.com/wp-content/uploads/2012/05/subeclipse07.png" alt="" width="425" height="307" /></a></p>
<p>Las carpetas que ves con un icono de color amarillo son aquellos archivos que están tal cuál se encuentran en el repositorio remoto. En cambio, aquellos archivos que se encuentran con un icono de color café con un asterisco son aquellos que yo he modificado.</p>
<p>En un entorno colaborativo en el que estés trabajando sobre un proyecto propio podrás subir estos últimos archivos que modifiques para que el proyecto remoto vaya teniendo tus actualizaciones.</p>
<p>Algo importante es que siempre que subas actualizaciones hagas pruebas exhaustivas de que el módulo o cambios que estés implementando no tenga errores y funcione de lo mejor para que siempre se tenga en el repositorio la versión final y estable en cada iteración.</p>
<p>Ahora bien, para subir estas actualizaciones basta con dar clic derecho sobre el nombre de tu proyecto y elegir la opción <em>Team &gt; Commit</em>. Dependiendo de las acciones que necesites aplicar a un proyecto que estés compartiendo con otros miembros de tu equipo, será en este menú <em>Team</em> donde las encontrarás.</p>
<p>Por último, si has estado trabajando en algún proyecto de forma local y de repente se unen a ti otros desarrolladores, puedes subir tu código a un repositorio que previamente hayas levantado dando clic derecho <em>Team &gt; Share Project</em> y configurar en el wizzard la URL de dónde se encuentra el respositorio remoto que lo albergará. Con esto damos paso a que cualquier otra persona a la cuál le proporcionemos la URL pueda empezar también a trabajar sobre nuestro proyecto.</p>
<p>Si hasta ahora es la primera vez que planeas utilizar este plugin, te comparto un par de referencias que te pueden ayudar a despejar las dudas básicas de cómo utilizarlo:</p>
<ul>
<li><a href="http://www.ibm.com/developerworks/opensource/library/os-ecl-subversion/" target="_blank">How to use subversion with Eclipse</a></li>
<li><a href="http://ist.berkeley.edu/as-ag/tools/usage/subclipse-usage-tips.html" target="_blank">Subeclipse usage: Tips &amp; Tricks</a></li>
</ul>
<p>Como lo dije al inicio del post, un software de control de versiones es una de las herramientas básicas para trabajar en equipo, espero que te sirva y que te agilice muchos procesos.</p>
<p>&nbsp;</p>
<p style="text-align: center;"><strong>¿Te fue útil este post? ¡Compártelo!</strong></p>
<p>&nbsp;</p>
<img src="http://feeds.feedburner.com/~r/androideity/~4/TC-dMTPpn3s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://androideity.com/2012/05/15/administra-tus-repositorios-con-subeclipse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://androideity.com/2012/05/15/administra-tus-repositorios-con-subeclipse/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=administra-tus-repositorios-con-subeclipse</feedburner:origLink></item>
		<item>
		<title>Reproducir videos de Youtube desde tu app Android</title>
		<link>http://feedproxy.google.com/~r/androideity/~3/8Bn9cmXOFcE/</link>
		<comments>http://androideity.com/2012/05/13/reproducir-videos-de-youtube-desde-tu-app-android/#comments</comments>
		<pubDate>Mon, 14 May 2012 01:37:43 +0000</pubDate>
		<dc:creator>Condesa</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[desarrollo en android]]></category>
		<category><![CDATA[librerías]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://androideity.com/?p=3385</guid>
		<description><![CDATA[<a href="http://androideity.com/2012/05/13/reproducir-videos-de-youtube-desde-tu-app-android/"><img align="left" hspace="5" width="100" height="100" src="http://androideity.com/wp-content/uploads/2012/05/youtube10-150x150.png" class="alignleft wp-post-image tfe" alt="" title="Videos Youtube en Android" /></a>  En alguna ocasión abordamos el tema de los Intents y de cómo nos permiten en ocasiones utilizar las aplicaciones que el usuario ya tiene instaladas en su smartphone para lanzar algunas acciones como reproducir audio o video, abrir un &#8230; <a href="http://androideity.com/2012/05/13/reproducir-videos-de-youtube-desde-tu-app-android/">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"> <a title="Videos Youtube en Android" href="http://androideity.com/wp-content/uploads/2012/05/youtube10.png" target="_blank"><img class="aligncenter size-full wp-image-3406" style="margin-top: 10px; margin-bottom: 10px;" title="Videos Youtube en Android" src="http://androideity.com/wp-content/uploads/2012/05/youtube10.png" alt="" width="578" height="280" /></a></p>
<p>En alguna ocasión abordamos el <a title="Intents en Android: Intents implícitos" href="http://androideity.com/2011/10/19/intents-en-android-implicitos/" target="_blank">tema de los Intents</a> y de cómo nos permiten en ocasiones utilizar las aplicaciones que el usuario ya tiene instaladas en su smartphone para lanzar algunas acciones como reproducir audio o video, abrir un link en un browser, compartir información a través de una red social, etc. sin tener que reinventar la rueda.</p>
<p>Este método nos permite entonces, de manera muy sencilla y con una línea de código, reproducir videos de Youtube a partir de una URL.</p>
<p>Con algo como esto:</p>
<p style="text-align: center;"><em>startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(&#8220;http://www.youtube.com/watch?v=_JkkkdH6zTQ&#8221;));</em></p>
<p style="text-align: left;"><em></em>Obtendría este resultado:</p>
<p style="text-align: left;"><a href="http://androideity.com/wp-content/uploads/2012/05/youtube_011.png"><img class="aligncenter size-full wp-image-3390" title="Videos de Youtube en Android" src="http://androideity.com/wp-content/uploads/2012/05/youtube_011.png" alt="" width="459" height="474" /></a></p>
<p>&nbsp;</p>
<p>Mediante este método, el usuario es quien decidirá qué aplicación desea utilizar para ver el contenido multimedia de nuestra aplicación. Pero, ¿qué pasaría si lo que necesitamos es reproducir ese video dentro de nuestra aplicación y no a través de un <em>Intent</em>?</p>
<p>Existe una librería que me encontré en estos días y que me ha parecido bastante útil para lograr esto que te comento. ¿List@ para conocerla?</p>
<p><span id="more-3385"></span>La librería en cuestión se llama <em>android-youtube-player</em>, un proyecto <em>open source</em> que puedes encontrar en <a href="http://code.google.com/p/android-youtube-player/" target="_blank">este link</a>. El equipo detrás de esta librería es <em><a href="http://keyeslabs.com/joomla/" target="_blank">KeyesLabs</a></em>. Básicamente, el objetivo de este proyecto es proporcionar una <em>Activity</em> que nos permita reproducir un video de Youtube en cualquier dispositivo sin necesariamente tener instalada alguna otra aplicación que reproduzca video.</p>
<p>Para implementar la funcionalidad de la librería es necesario descargarnos el archivo <em>openyoutubeactivity-1.1.jar</em> desde <a href="http://code.google.com/p/android-youtube-player/downloads/list" target="_blank">este link</a>.</p>
<p>1. Para efectos demostrativos de cómo utilizar la librería, he creado un nuevo proyecto Android con la versión 2.2 llamado <em>YoutubePlayer</em>.</p>
<p>2. En la carpeta raíz de mi proyecto he creado un directorio llamado <em>lib</em> en dónde he copiado el archivo <em>.jar</em> que me descargué previamente.</p>
<p style="text-align: center;"><a title="Videos de Youtube en Android" href="http://androideity.com/wp-content/uploads/2012/05/youtube_02.png" target="_blank"><img class="aligncenter  wp-image-3393" style="margin-top: 10px; margin-bottom: 10px;" title="Videos de Youtube en Android" src="http://androideity.com/wp-content/uploads/2012/05/youtube_02.png" alt="" width="480" height="222" /></a></p>
<p>3. En Eclipse, es necesario dar clic derecho sobre el nombre de mi proyecto y seleccionar <em>Refresh</em> para que me actualice los cambios que le hice a esta carpeta desde el explorador de archivos de mi computadora.</p>
<p>4. Posteriormente tendré que agregar la referencia de la librería en mi proyecto, por lo cuál doy clic derecho nuevamente sobre el nombre del proyecto y selecciono la opción <em>Properties &gt; Java Build Path &gt; Add JARs&#8230;</em> y elijo el archivo <em>.jar</em> del directorio <em>lib</em>.</p>
<p>Con esto, ya tendré todo listo para utilizar las clases de la librería con el proyecto que esté desarrollando.</p>
<p style="text-align: center;"><a title="Videos de Youtube en Android" href="http://androideity.com/wp-content/uploads/2012/05/youtube_03.png" target="_blank"><img class="aligncenter size-full wp-image-3394" style="margin-top: 10px; margin-bottom: 10px;" title="Videos de Youtube en Android" src="http://androideity.com/wp-content/uploads/2012/05/youtube_03.png" alt="" width="280" height="292" /></a></p>
<p>5. Este proyecto cuenta con su propia documentación que puedes consultar <a href="http://code.google.com/p/android-youtube-player/wiki/OpenYouTubePlayerActiviyInstructions" target="_blank">aquí</a>. Se nos explica claramente los casos en los que la librería sería una opción válida a utilizar, entre los cuáles están:</p>
<ul>
<li>Cuando necesites reproducir contenido de video sin incluir dicho recurso en tu aplicación ya que eso haría pesado tu proyecto y no es lo más óptimo.</li>
<li>Cuando necesites que el usuario pueda volver rápidamente a tu aplicación después de haber reproducido el video.</li>
<li>Cuando quieras ahorrarte el trabajo de construir una aplicación especializada en reproducir videos de Youtube.</li>
</ul>
<p>Partiendo de esto, el siguiente paso es conocer qué parámetros necesita la librería para poder hacer su trabajo. Como lo dije líneas arriba, la librería consta de una <em>activity </em>que mandaremos a llamar a través de un Intent pero con la particularidad de que no nos dará la opción de elegir una aplicación externa, sino que el usuario verá que el video lo reproduce la propia aplicación. El parámetro que necesita esta <em>activity</em> es el ID del video. En las URL&#8217;s de Youtube podemos identificar este atributo como la cadena que sigue de <em>&#8220;v=&#8221;</em>. Por ejemplo, en esta URL: &#8220;<em>http://www.youtube.com/watch?v=_JkkkdH6zTQ</em>&#8220;, la ID corresponde a: &#8220;<em>_JkkkdH6zTQ</em>&#8220;.</p>
<p>Por esa razón, vamos a diseñar una pantalla que nos pida un ID válido para que podamos mandar a llamar a la <em>activity</em> de la librería y podamos verla en acción.</p>
<p>6. Modifico entonces el archivo <em>res &gt; layout &gt; main.xml</em> para que tenga el siguiente código:</p>
<p style="text-align: center;"><a title="Videos de Youtube en Android" href="http://androideity.com/wp-content/uploads/2012/05/youtube_04.png" target="_blank"><img class="aligncenter  wp-image-3396" style="margin-top: 10px; margin-bottom: 10px;" title="Videos de Youtube en Android" src="http://androideity.com/wp-content/uploads/2012/05/youtube_04.png" alt="" width="493" height="457" /></a></p>
<p>Las cadenas de texto que utilizo en esta pantalla son las siguientes y las he agregado en el archivo <em>res &gt; values &gt; strings.xml</em>:</p>
<p style="text-align: center;"><a title="Videos de Youtube en Android" href="http://androideity.com/wp-content/uploads/2012/05/youtube_05.png" target="_blank"><img class="aligncenter  wp-image-3397" style="margin-top: 10px; margin-bottom: 10px;" title="Videos de Youtube en Android" src="http://androideity.com/wp-content/uploads/2012/05/youtube_05.png" alt="" width="494" height="166" /></a></p>
<p> 7. En la actividad principal de nuestro proyecto vamos a llamar a <em>OpenYouTubePlayerActivity</em>, que es la actividad que se encarga de reproducir los videos. Esta actividad es la que viene incluida en la librería; el resto de las clases se utilizan para darle forma al funcionamiento de la misma. Entonces, nos resulta realmente sencillo construir la llamada. Mi código es el siguiente:</p>
<p style="text-align: center;"><a title="Videos de Youtube en Android" href="http://androideity.com/wp-content/uploads/2012/05/youtube_061.png" target="_blank"><img class="aligncenter  wp-image-3399" style="margin-top: 10px; margin-bottom: 10px;" title="Videos de Youtube en Android" src="http://androideity.com/wp-content/uploads/2012/05/youtube_061-1024x553.png" alt="" width="496" height="267" /></a></p>
<p>&nbsp;</p>
<p>Aquí lo único que estoy haciendo es instanciar mi <em>EditText</em> que es en dónde escribo directamente el código del video que quiero reproducir, y el <em>Button</em> que me ayudará a mandarle ese ID a <em>OpenYouTubePlayerActivity</em>. La parte importante del código son estas dos líneas:</p>
<p style="text-align: left; padding-left: 30px;"><em>Intent lVideoIntent = new Intent(null, Uri.parse(&#8220;ytv://&#8221;+videoId), MainActivity.this, OpenYouTubePlayerActivity.class);</em></p>
<p style="text-align: left; padding-left: 30px;"><em>startActivity(lVideoIntent);</em></p>
<p>En dónde creo el <em>Intent</em> utilizando el constructor que recibe cuatro parámetros: <em>action</em>, <em>uri</em>, <em>packageContext</em> y <em>cls</em>. (<a href="http://developer.android.com/reference/android/content/Intent.html#Intent(java.lang.String, android.net.Uri, android.content.Context, java.lang.Class&lt;?&gt;)" target="_blank">Ver documentación oficial)</a>.</p>
<p>8. Para que todo salga bien, necesito agregar algunos datos al <em>AndroidManifest.xml</em> tales como el registro de la actividad <em>OpenYouTubePlayerActivity</em> y los permisos de acceso a internet y a la información del estado de la WiFi. De tal forma que tu archivo manifest deberá verse como este:</p>
<p style="text-align: center;"><a title="Videos de Youtube en Android" href="http://androideity.com/wp-content/uploads/2012/05/youtube_07.png" target="_blank"><img class="aligncenter  wp-image-3403" style="margin-top: 10px; margin-bottom: 10px;" title="Videos de Youtube en Android" src="http://androideity.com/wp-content/uploads/2012/05/youtube_07.png" alt="" width="527" height="516" /></a></p>
<p>Es importante resaltar que dado que la actividad que estamos registrando no pertenece a ninguno de nuestros paquetes, es necesario escribir el nombre completo con los espacios de nombres de la librería para que nuestra aplicación no nos lance un error al ejecutarla.</p>
<p>Otro detalle es que le hemos habilitado la orientación <em>landscape</em> para que el usuario vea de forma más cómoda el video.</p>
<p>9. Procedemos a ejecutar la aplicación y tendremos como resultado lo siguiente:</p>
<p style="text-align: center;"><a title="Videos de Youtube en Android" href="http://androideity.com/wp-content/uploads/2012/05/youtube_08.png" target="_blank"><img class="aligncenter  wp-image-3404" style="margin-top: 10px; margin-bottom: 10px;" title="Videos de Youtube en Android" src="http://androideity.com/wp-content/uploads/2012/05/youtube_08.png" alt="" width="288" height="480" /></a></p>
<p>&nbsp;</p>
<p style="text-align: center;"><a title="Videos de Youtube en Android" href="http://androideity.com/wp-content/uploads/2012/05/youtube_09.png" target="_blank"><img class="aligncenter  wp-image-3405" style="margin-top: 10px; margin-bottom: 10px;" title="Videos de Youtube en Android" src="http://androideity.com/wp-content/uploads/2012/05/youtube_09.png" alt="" width="480" height="288" /></a></p>
<p>&nbsp;</p>
<p>Leyendo en la parte de la Wiki de este proyecto, vi que varios usuarios han tenido problemas para agregar la librería y utilizarla directamente del archivo Jar. Si llegas a tener algún problema también o bien, quieres personalizar los controles del reproductor te recomiendo descargarte el código fuente del proyecto a través de SVN. La sección <em>Source</em> del proyecto la puedes encontrar <a href="http://code.google.com/p/android-youtube-player/source/checkout" target="_blank">aquí</a> junto con el link del repo para poder tener las clases que conforman las librerías.</p>
<p>La clase <em>OpenYouTubeActivity</em> es la que tendrás que modificar para personalizar los controles y otras cosas que necesite tu proyecto. Por último, te recomiendo que cuando agregues estas clases a tu proyecto lo hagas asignándoles un paquete propio para que te sea siempre más sencillo identificar el código correspondiente a un &#8220;módulo&#8221; específico de funcionalidad.</p>
<p>Espero que el uso de esta librería te sea de utilidad, recuerda también siempre agradecer y reconocer el trabajo de los demás cuando utilices una librería de terceros. <img src='http://androideity.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>&nbsp;</p>
<p style="text-align: center;"><strong>¿Te gustó este post? ¡Compártelo!</strong></p>
<p>&nbsp;</p>
<img src="http://feeds.feedburner.com/~r/androideity/~4/8Bn9cmXOFcE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://androideity.com/2012/05/13/reproducir-videos-de-youtube-desde-tu-app-android/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		<feedburner:origLink>http://androideity.com/2012/05/13/reproducir-videos-de-youtube-desde-tu-app-android/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=reproducir-videos-de-youtube-desde-tu-app-android</feedburner:origLink></item>
		<item>
		<title>La importancia del MVC en Android</title>
		<link>http://feedproxy.google.com/~r/androideity/~3/8bib8hmJNxI/</link>
		<comments>http://androideity.com/2012/05/10/la-importancia-del-mvc-en-android/#comments</comments>
		<pubDate>Thu, 10 May 2012 17:42:40 +0000</pubDate>
		<dc:creator>Condesa</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[conceptos básicos]]></category>
		<category><![CDATA[conociendo Android]]></category>
		<category><![CDATA[desarrollo en android]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://androideity.com/?p=3378</guid>
		<description><![CDATA[<a href="http://androideity.com/2012/05/10/la-importancia-del-mvc-en-android/"><img align="left" hspace="5" width="100" height="100" src="http://androideity.com/wp-content/uploads/2012/05/modelovistacontrolador-150x150.png" class="alignleft wp-post-image tfe" alt="" title="MVC en Android" /></a>Estás iniciándote en el desarrollo móvil y te preguntas: &#8220;¿Por dónde empiezo? ¿Qué debo saber? ¿Cómo debo programar?&#8221;. Yo parto de una primera premisa &#8220;El desarrollo móvil NO es fácil pero tampoco es imposible&#8221;. Lo más importante al inicio, aparte &#8230; <a href="http://androideity.com/2012/05/10/la-importancia-del-mvc-en-android/">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a title="MVC en Android" href="http://androideity.com/wp-content/uploads/2012/05/modelovistacontrolador.png" target="_blank"><img class="aligncenter size-full wp-image-3383" style="margin-top: 10px; margin-bottom: 10px;" title="MVC en Android" src="http://androideity.com/wp-content/uploads/2012/05/modelovistacontrolador.png" alt="" width="578" height="280" /></a></p>
<p>Estás iniciándote en el desarrollo móvil y te preguntas: <em>&#8220;¿Por dónde empiezo? ¿Qué debo saber? ¿Cómo debo programar?&#8221;</em>.</p>
<p>Yo parto de una primera premisa <strong>&#8220;El desarrollo móvil NO es fácil pero tampoco es imposible&#8221;</strong>. Lo más importante al inicio, aparte de irte familiarizando con las herramientas y con los lenguajes que puedes utilizar del abanico de opciones disponibles, es estar al tanto de las arquitecturas que te permitirán crear buenas aplicaciones no sólo desde el enfoque de <em>performance</em> sino también desde un enfoque técnico.</p>
<p>El día de hoy vengo a platicarte de la arquitectura que se utiliza en el desarrollo móvil, su importancia y por qué si aún no la conoces debes considerar seriamente empaparte de ella para cambiar tus prácticas de programación.</p>
<p><span id="more-3378"></span>En Android utilizamos el patrón de arquitectura llamado <strong>Modelo Vista Controlador (MVC)</strong> cuya principal bondad consiste en separar los datos de una aplicación, la interfaz de usuario y la lógica de negocios en tres componentes distintos que se relacionarán para al final tener como resultado nuestra aplicación.</p>
<p>De esta forma podemos seccionar de forma más fácil nuestro equipo de trabajo y dedicarnos a desarrollar nuestros componentes de tal forma que construyamos módulos o librerías con funcionalidades específicas que incluso podríamos reutilizar en proyectos posteriores y no simplemente en el proyecto actual. Para lograr esto, el diseño de la arquitectura de nuestra aplicación juega un papel importante y la capacidad de abstracción que tengamos desarrollada.</p>
<p>Por ejemplo, yo me podría dedicar a desarrollar una librería que me permita hacer conexiones con la API de Twitter. En mis clases puedo diseñar todas las funciones que me ayudarán a lograr las llamadas al protocolo OAuth, aquellas que me permitan twittear, recuperar información de tweets, followers, trending topics, etc. Esta librería, con un buen diseño y abstracción podría ser útil para todos los proyectos que necesiten conectarse con Twitter.</p>
<p>Volvámonos un poco teóricos y expliquemos de qué se tratan los componentes de este modelo:</p>
<p style="text-align: center;"><a title="MVC en Android" href="http://androideity.com/wp-content/uploads/2012/05/mvc.png" target="_blank"><img class="aligncenter  wp-image-3381" style="margin-top: 10px; margin-bottom: 10px;" title="MVC en Android" src="http://androideity.com/wp-content/uploads/2012/05/mvc.png" alt="" width="574" height="385" /></a></p>
<ul>
<li><strong>Modelo.</strong> Nos referimos con modelo a las representaciones que construiremos basadas en la información con la que operará nuestra aplicación. En Java, el modelo viene siendo análogo a los <em>beans</em> que tienen la particularidad de ser reutilizables y nos ayudan a cumplir con el proverbio de oro <em><strong>&#8220;Don´t Repeat Yourself&#8221; (DRY)</strong></em> haciendo a nuestras aplicaciones escalables. En esta parte del modelo también juega la decisión de qué modelo para almacenar información utilizaré. ¿Base de datos? ¿Web services? El modelo que elijas depende obviamente de las necesidades de información de tu aplicación. Actualmente tenemos tutoriales de <a title="Manejo de bases de datos en Android I" href="http://androideity.com/2011/10/12/manejo-de-bases-de-datos-en-android-i/" target="_blank">SQLite</a> y <a title="Consumiendo Web Service SOAP-JSON con Android I" href="http://androideity.com/2011/11/16/consumiendo-web-service-soap-json-con-android-i/" target="_blank">WebServices</a> que te pueden ayudar.</li>
<li><strong>Vista.</strong> La vista no es más que la interfaz con la que va a interactuar el usuario. En Android, las interfaces las construimos en XML. Suelo utilizar mucho la analogía de que esta parte es realmente parecida a lo que hacemos en el desarrollo web con los CSS. Contruimos nuestro esqueleto en XML que equivale al HTML de un sitio. Posteriormente, con ayuda de estilos, que también los escribimos en XML, podemos empezar a darle formato de colores, posiciones, formato, etc. a nuestro esqueleto. Esto equivale a los CSS. Si vienes de un ambiente web, aprovecha ese conocimiento para aplicarlo a crear aplicaciones Android. Si quieres saber más acerca de estilos, checa <a title="Aplicar estilos y temas en Android" href="http://androideity.com/2011/09/14/aplicar-estilos-y-temas-en-android/" target="_blank">este tutorial</a>.</li>
<li><strong>Controlador.</strong> Finalmente nos topamos con el controlador que son todas esas clases que nos ayudarán a darle vida a esas interfaces bonitas que ya construimos y nos permitirán desplegar y consumir información de/para el usuario. Estos controladores se programan en lenguaje Java y son el core de la aplicación.</li>
</ul>
<p>¿Puedes ver la ventaja? Así es, podemos tener perfiles especializados en construir cada uno de estos componentes y tener un resultado de calidad en cada uno y al final obtener una buena aplicación. El truco para que todo salga bien es ser disciplinados para poder ser programadores ordenados, eso es vital en la aplicación de esta arquitectura. Por experiencia, te puedo decir que si te esfuerzas en construir una buena arquitectura de aplicación te ahorrarás muchos dolores de cabeza después y te evitarás tener que duplicar líneas de código que hacen lo mismo, podrás escalar fácilmente tu aplicación, agregar funcionalidades nuevas sin tanto embrollo y ¿por qué no?, facilitar el comienzo de nuevos proyectos.</p>
<p>Para empezar a aplicar esta arquitectura debes saber también su flujo:</p>
<ol>
<li>Todo parte cuando el usuario interactúa con tu aplicación, el jugador actual es la vista. (El usuario quiere mandar un Tweet).</li>
<li>El controlador recibe la notificación de la acción solicitada. (Por medio de un handler verificará si el usuario está logueado o no en su cuenta de Twitter).</li>
<li>El modelo es llamado para ser modificado. (Podemos accesar al caché de tweets que se tenían desde la última vez que el usuario abrió la aplicación y se conectó a Internet y agregar el nuevo tweet).</li>
<li>Una vez que tenemos los nuevos tweets y la publicación que quiere hacer el usuario, el controlador nuevamente toma partida para llamar a la vista correcta que desplegará el Timeline actualizado.</li>
<li>¡Listo! El usuario ya tiene la nueva interfaz para seguir interactuando con la aplicación y volver a iniciar el ciclo cuando solicite otra acción.</li>
</ol>
<p>Otra de las cosas que te ayudan a seguir este modelo es tener ordenado tu proyecto. Utiliza las convenciones de los lenguajes que utilices y las buenas prácticas para que sea más fácil acoplar a tus compañeros de equipo (no siempre uno solo se echa el paquete de hacer una aplicación y menos aún si es una compleja). Te aconsejo empezar con cosas tan sencillas como el nombramiento de paquetes, clases y variables, y después organizar los recursos que vayas a utilizar delegando siempre a cada componente lo que le corresponde.</p>
<p>En la web puedes encontrar muchos recursos que puedes leer para ver ejemplos de la aplicación de esta arquitectura. No es algo nuevo pero algunos no la conocen.  Sin importar que encuentres un ejemplo para web, recuerda que en la programación únicamente cambia el lenguaje, la lógica y la metodología es la que se preserva.</p>
<p>Si aún no utilizas esta arquitectura para construir tus aplicaciones Android creo que es un buen momento para tomarlo en cuenta y empezar a aplicar. <img src='http://androideity.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>&nbsp;</p>
<p style="text-align: center;"><strong>¿Te fue útil este post? ¡Compártelo!</strong></p>
<p style="text-align: center;"><strong></strong></p>
<p>Referencia teórica: <a href="http://es.wikipedia.org/wiki/Modelo_Vista_Controlador" target="_blank">Wikipedia</a></p>
<p>&nbsp;</p>
<img src="http://feeds.feedburner.com/~r/androideity/~4/8bib8hmJNxI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://androideity.com/2012/05/10/la-importancia-del-mvc-en-android/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://androideity.com/2012/05/10/la-importancia-del-mvc-en-android/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=la-importancia-del-mvc-en-android</feedburner:origLink></item>
		<item>
		<title>Utilizando el componente SlidingDrawer de Android</title>
		<link>http://feedproxy.google.com/~r/androideity/~3/HeGp-_nqcVY/</link>
		<comments>http://androideity.com/2012/05/06/utilizando-el-componente-slidingdrawer-de-android/#comments</comments>
		<pubDate>Sun, 06 May 2012 22:19:26 +0000</pubDate>
		<dc:creator>Condesa</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[conceptos básicos]]></category>
		<category><![CDATA[desarrollo en android]]></category>
		<category><![CDATA[diseño en Android]]></category>
		<category><![CDATA[gui]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://androideity.com/?p=3356</guid>
		<description><![CDATA[<a href="http://androideity.com/2012/05/06/utilizando-el-componente-slidingdrawer-de-android/"><img align="left" hspace="5" width="100" height="100" src="http://androideity.com/wp-content/uploads/2012/05/slidingdrawer-150x150.png" class="alignleft wp-post-image tfe" alt="" title="SlidingDrawer" /></a>Siguiendo con los tutoriales que les pueden ayudar a agregar widgets muy atractivos y funcionales en sus aplicaciones, el día de hoy les vengo a platicar de SlidingDrawer, un componente nativo del SDK de Android. Para que te des una &#8230; <a href="http://androideity.com/2012/05/06/utilizando-el-componente-slidingdrawer-de-android/">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a title="SlidingDrawer" href="http://androideity.com/wp-content/uploads/2012/05/slidingdrawer.png" target="_blank"><img class="aligncenter size-full wp-image-3374" style="margin-top: 10px; margin-bottom: 10px;" title="SlidingDrawer" src="http://androideity.com/wp-content/uploads/2012/05/slidingdrawer.png" alt="" width="578" height="280" /></a></p>
<p>Siguiendo con los tutoriales que les pueden ayudar a agregar widgets muy atractivos y funcionales en sus aplicaciones, el día de hoy les vengo a platicar de <strong>SlidingDrawer</strong>, un componente nativo del SDK de Android. Para que te des una idea del widget del que estoy hablando, aquí te va una imagen:</p>
<p style="text-align: center;"><a title="SlidingDrawer" href="http://androideity.com/wp-content/uploads/2012/05/slidingdrawer01.png" target="_blank"><img class="aligncenter size-full wp-image-3357" style="margin-top: 10px; margin-bottom: 10px;" title="SlidingDrawer" src="http://androideity.com/wp-content/uploads/2012/05/slidingdrawer01.png" alt="" width="328" height="489" /></a></p>
<p>El menú que aparecía en las primeras versiones de Android se puede &#8220;duplicar&#8221; en funcionalidad con el componente que conoceremos el día de hoy. Para empezar a ver cómo implementar este componente he creado un nuevo proyecto llamado <em>SlidingDrawerTest</em> con la versión 2.2 de Android.</p>
<p><span id="more-3356"></span></p>
<p>1. El primer paso es conocer qué necesitamos para armar la parte visual del <em>SlidingDrawer</em> y para ello resulta bueno echarle siempre un vistazo a lo que nos dice la <a href="http://developer.android.com/reference/android/widget/SlidingDrawer.html" target="_blank">documentación oficial</a>. Este componente puede tener un scroll vertical u horizontal, nuestra selección dependerá obviamente del resultado visual que queramos obtener.</p>
<p>Este widget se compone de dos partes importantes: un <em>handle</em> y un <em>content</em>. El primero corresponde a la imagen/pestaña que dispara los eventos de ocultar y mostrar el contenido; el segundo es el contenido que se mostrará cuando el componente se encuentre en su estado &#8220;abierto&#8221;. Sabiendo esto, podemos empezar a bosquejar qué recursos de imagen y de widgets en XML necesitaremos agregar a nuestra aplicación.</p>
<p>El caso que me llevó a utilizar este componente fue que necesitaba desplegar un Scroll de imágenes que en su estado normal estuviera oculto y que al dar clic sobre una pequeña pestaña se mostraran las imágenes. A continuación te comparto un borrador de lo que al final tendremos con nuestro ejemplo:</p>
<p style="text-align: center;"><a title="SlidingDrawer" href="http://androideity.com/wp-content/uploads/2012/05/slidingdrawer02.jpg" target="_blank"><img class="aligncenter  wp-image-3358" style="margin-top: 10px; margin-bottom: 10px;" title="SlidingDrawer" src="http://androideity.com/wp-content/uploads/2012/05/slidingdrawer02.jpg" alt="" width="600" height="400" /></a></p>
<p>Así que para empezar voy a agregar los recursos de imagen necesarios para poder concluir mi ejemplo. Los recursos que voy a utilizar los puedes descargar desde <a href="http://dl.dropbox.com/u/12316307/recursos_slidingdrawer.zip" target="_blank">este link</a>.</p>
<p>Una vez que descomprimas el archivo, estas imágenes deberás pegarlas en el directorio <em>res &gt; drawable</em> de tu proyecto.</p>
<p>2. Para ir armando la interfaz de usuario te aconsejo que siempre trates de descomponer tu bosquejo en partes sencillas para que puedas trabajar de forma más cómoda el diseño en XML. De acuerdo al bosquejo que te compartí arriba, vamos a empezar por crear el layout de cada una de las imágenes que quiero mostrar en el scroll. Para ello, he creado un archivo llamado <em>imagen_scroll.xml</em> que tiene el siguiente código:</p>
<p style="text-align: center;"> <a title="SlidingDrawer" href="http://androideity.com/wp-content/uploads/2012/05/slidingdrawer03.png" target="_blank"><img class="aligncenter  wp-image-3360" style="margin-top: 10px; margin-bottom: 10px;" title="SlidingDrawer" src="http://androideity.com/wp-content/uploads/2012/05/slidingdrawer03.png" alt="" width="670" height="641" /></a></p>
<p>El resultado visual de este layout es darle formato a cada una de las imágenes que me interesen agregar a un scroll horizontal que se mostrará cuando el <em>SlidingDrawer</em> se abra. El código de arriba debe darte algo como esto:</p>
<p style="text-align: center;"><a title="SlidingDrawer" href="http://androideity.com/wp-content/uploads/2012/05/slidingdrawer04.png" target="_blank"><img class="aligncenter size-full wp-image-3361" style="margin-top: 10px; margin-bottom: 10px;" title="SlidingDrawer" src="http://androideity.com/wp-content/uploads/2012/05/slidingdrawer04.png" alt="" width="178" height="182" /></a></p>
<p>3. El siguiente paso será diseñar la parte del layout que corresponde al <em>SlidingDrawer</em>. Para ello he modificado el archivo <em>main.xml</em> para que contenga el siguiente código:</p>
<p style="text-align: center;"><a title="SlidingDrawer" href="http://androideity.com/wp-content/uploads/2012/05/slidingdrawer05.png" target="_blank"><img class="aligncenter  wp-image-3363" style="margin-top: 10px; margin-bottom: 10px;" title="SlidingDrawer" src="http://androideity.com/wp-content/uploads/2012/05/slidingdrawer05.png" alt="" width="587" height="335" /></a></p>
<p> He definido primero un <em>LinearLayout</em> que abarque todo el espacio de la pantalla y le he definido un atributo <em>android:gravity</em> con <em>bottom|fill_horizontal</em> para que el <em>SlidingDrawer</em> se vaya hasta la parte inferior de la pantalla como lo bosquejé en un principio. El componente <em>SlidingDrawer</em> tiene asignado una ID para que pueda manipularlo desde mi activity y también tiene declarados dos ID&#8217;s más que corresponden al <em>handle</em> y al <em>content</em> que anidará más adelante.</p>
<p>4. Para la parte del <em>handle</em> voy a definir un <em>LinearLayout</em> que contenga la imagen que corresponde al tab que yo quiera según el diseño de mi aplicación. En este paso utilizaremos una de las imágenes que agregamos en el primer paso. Por lo tanto el código que te muestro a continuación lo escribirás dentro de las pestañas <em>&lt;SlidingDrawer&gt;&#8230;&lt;/SlidingDrawer&gt;</em>:</p>
<p style="text-align: center;"><a title="SlidingDrawer" href="http://androideity.com/wp-content/uploads/2012/05/slidingdrawer09.png" target="_blank"><img class="aligncenter  wp-image-3368" style="margin-top: 10px; margin-bottom: 10px;" title="SlidingDrawer" src="http://androideity.com/wp-content/uploads/2012/05/slidingdrawer09.png" alt="" width="436" height="297" /></a></p>
<p>Como podrás observar, es al <em>LinearLayout</em> el componente al cuál le mando a llamar el ID <em>handle</em> que ya había definido el componente. Posteriormente le asigno un ID al <em>ImageView</em> para poder manipularlo desde el código.</p>
<p>5. Para terminar esta parte, voy a agregar, seguido del código anterior, la declaración de los componentes que corresponden al <em>content</em> del <em>slidingDrawer</em>. El código es el siguiente:</p>
<p style="text-align: center;"><a title="SlidingDrawer" href="http://androideity.com/wp-content/uploads/2012/05/slidingdrawer07.png" target="_blank"><img class="aligncenter  wp-image-3365" style="margin-top: 10px; margin-bottom: 10px;" title="SlidingDrawer" src="http://androideity.com/wp-content/uploads/2012/05/slidingdrawer07.png" alt="" width="491" height="486" /></a></p>
<p>En este caso, es un <em>HorizontalScrollView</em> el que llevará la referencia al ID <em>content</em>. Un <em>HorizontalScrollView</em> únicamente puede contener un elemento hijo de forma directa, por lo que le anido un <em>LinearLayout</em> que me ayudará a agregar todas las imágenes que necesite mostrar en el scroll. Como este simplemente es un demo, insertaré de forma &#8220;manual&#8221; las imágenes. En un caso real, estas imágenes podrían agregarse en tiempo de ejecución a través de un Web Service, una Base de datos o cualquier otro método que estemos utilizando para recuperar una serie de imágenes.</p>
<p>Como en un paso anterior hicimos el layout de cada una de las imágenes que contiene el scroll, podemos insertar este diseño dentro de otro con la etiqueta <em>&lt;include&#8230;&gt;</em>. Esta práctica es muy parecida a la utilizada en diseño web en dónde puedes trabajar trozos de la interfaz que se repetirá en más de una página y así no tener que escribir el mismo código muchas veces. En el desarrollo móvil es igual y resulta muy útil y mantenible esta práctica.</p>
<p>6. Ahora que ya tenemos nuestra interfaz lista podemos ejecutar nuestro ejemplo y ver el resultado visual que es el siguiente:</p>
<p style="text-align: center;"><a title="SlidingDrawer" href="http://androideity.com/wp-content/uploads/2012/05/slidingdrawer08.png" target="_blank"><img class="aligncenter  wp-image-3367" style="margin-top: 10px; margin-bottom: 10px;" title="SlidingDrawer" src="http://androideity.com/wp-content/uploads/2012/05/slidingdrawer08.png" alt="" width="540" height="400" /></a></p>
<p>7.  Pues al parecer casi todo quedó bien. El detalle que nos falta trabajar es la imagen de la pestaña. Regularmente queremos que la imagen de la pestaña cambie para indicar su estado. Para ello, contamos con tres métodos que podemos implementar en nuestro componente <em>SlidingDrawer</em> y son los siguientes:</p>
<ul>
<li><em>OnDrawerCloseListener</em>. Que se ejecuta cuando el contenido del componente está oculto.</li>
<li><em>OnDrawerOpenListener</em>. Que se ejecuta cuando el contenido del componente se muestra y pasa a estar abierto.</li>
<li><em>OnDrawerScrollListener.</em> Que se ejecuta cuando el scroll está en proceso.</li>
</ul>
<p>8. Entonces, para cambiar la imagen de la pestaña tenemos que implementar los métodos <em>OnDrawerCloseListener</em> y <em>OnDrawerOpenListener</em>. Para ello, nos vamos a nuestra activity y escribimos el siguiente código:</p>
<p style="text-align: center;"><a title="SlidingDrawer" href="http://androideity.com/wp-content/uploads/2012/05/slidingdrawer10.png" target="_blank"><img class="aligncenter  wp-image-3370" style="margin-top: 10px; margin-bottom: 10px;" title="SlidingDrawer" src="http://androideity.com/wp-content/uploads/2012/05/slidingdrawer10.png" alt="" width="539" height="559" /></a></p>
<p>Para poder implementar los métodos es necesario tener una referencia al componente <em>SlidingDrawer</em>; por esa razón, he declarado una variable de esta clase llamada <em>mySlidingDrawer</em>. Después, como nuestro interés se centra en cambiar la imagen de la pestaña, entonces debemos crear otra variable de tipo <em>ImageView</em> que apunte a la imagen que representa la pestaña.</p>
<p>En el método <em>onCreate()</em> simplemente recuperamos las referencias según los Id&#8217;s que les hayas asignado a tus componentes. Por último, implementamos los métodos aplicando los listeners a la variable <em>mySlidingDrawer</em>. Cuida mucho que tengas las sentencias <em>import</em> necesarias para que tu código no marque errores. Ahora simplemente utilizamos el método <em>setImageResource</em> de la <em>ImageView</em> para cambiar la imagen de la pestaña. Con esto, volvemos a correr el ejemplo y veremos que este detalle ya está resuelto:</p>
<p style="text-align: center;"><a title="SlidingDrawer" href="http://androideity.com/wp-content/uploads/2012/05/slidingdrawer11.png" target="_blank"><img class="aligncenter  wp-image-3372" style="margin-top: 10px; margin-bottom: 10px;" title="SlidingDrawer" src="http://androideity.com/wp-content/uploads/2012/05/slidingdrawer11.png" alt="" width="540" height="400" /></a></p>
<p> Por último, si quieres que adicional al efecto de deslizar que ya presenta este componente quisieras que también se habilitara mostrar el contenido del <em>SlidingDrawer</em> al dar un clic sobre la pantalla puedes agregarlo sin problemas agregando el atributo <em>android:allowSingleTap=true</em>.</p>
<p>Este componente es muy útil y vistoso, espero que te sea de utilidad este tutorial para mejorar cada vez más los diseños de tus aplicaciones.</p>
<p>&nbsp;</p>
<p style="text-align: center;"><strong>¿Te gustó este post? ¡Compártelo!</strong></p>
<p>&nbsp;</p>
<img src="http://feeds.feedburner.com/~r/androideity/~4/HeGp-_nqcVY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://androideity.com/2012/05/06/utilizando-el-componente-slidingdrawer-de-android/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://androideity.com/2012/05/06/utilizando-el-componente-slidingdrawer-de-android/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=utilizando-el-componente-slidingdrawer-de-android</feedburner:origLink></item>
		<item>
		<title>Modern Combat 2 en tu Android</title>
		<link>http://feedproxy.google.com/~r/androideity/~3/7ggvzYiP6bk/</link>
		<comments>http://androideity.com/2012/05/05/modern-combat-2-en-tu-android/#comments</comments>
		<pubDate>Sat, 05 May 2012 17:18:11 +0000</pubDate>
		<dc:creator>jaime</dc:creator>
				<category><![CDATA[Videojuegos]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[GameLoft]]></category>
		<category><![CDATA[Juegos Android]]></category>
		<category><![CDATA[video juegos]]></category>

		<guid isPermaLink="false">http://androideity.com/?p=3336</guid>
		<description><![CDATA[<a href="http://androideity.com/2012/05/05/modern-combat-2-en-tu-android/"><img align="left" hspace="5" width="100" height="100" src="http://androideity.com/wp-content/uploads/2012/05/Modern-Combat-Android-0-150x150.png" class="alignleft wp-post-image tfe" alt="" title="Modern Combat Android" /></a>Twitter: @JaimeYesidLeon  En Androideity queremos traerte solo los mejores juegos para Android, aquellos que están esperando que sean jugados y llevados a su máxima capacidad, es por eso que hoy te acercamos esta recomendación que fue uno de los mejores &#8230; <a href="http://androideity.com/2012/05/05/modern-combat-2-en-tu-android/">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="https://twitter.com/#!/JaimeYesidLeon" target="_blank"><span style="color: #3399ff;"><strong>Twitter: @JaimeYesidLeon</strong></span></a></p>
<p style="text-align: center;"><a href="http://androideity.com/wp-content/uploads/2012/05/Modern-Combat-Android-0.png"><img class="aligncenter size-full wp-image-3338" style="margin-top: 20px; margin-bottom: 20px;" title="Modern Combat Android" src="http://androideity.com/wp-content/uploads/2012/05/Modern-Combat-Android-0.png" alt="" width="576" height="413" /></a></p>
<p> En Androideity queremos traerte solo los mejores juegos para Android, aquellos que están esperando que sean jugados y llevados a su máxima capacidad, es por eso que hoy te acercamos esta recomendación que fue uno de los mejores juegos en el momento de su estreno ya que no tenía muchos competidores en el ecosistema Android y los dispositivos en los que podía correr no llenaba una lista muy larga, pero con el avance de la tecnología y la gran oferta de dispositivos con sistema operativo Android que hay hoy en el mercado, Modern Combat es una experiencia de juego que no debes dejar pasar. Es cierto que ya tenemos la entrega 3 de este juego, la cual analizaremos en su debido momento, pero queremos mostrarte porque se habló tanto de este juego cuando salió al mercado.</p>
<p><span id="more-3336"></span></p>
<p>Los juegos que están hoy en día llenando nuestros televisores con personajes de acción, misiones a cumplir y enemigos a derrotar, tienen una historia que nos llena de nostalgia cuando recordamos aquellos momentos en donde las gráficas no eran lo importante, sino las emociones que despertaban estos juegos tipo FPS o también llamados tipo “Shooter”. Tal vez si eres muy joven no tuviste la oportunidad de ver como eran los juegos en 3 dimensiones anteriormente, los cuales fueron la base para juegos como Modern Combat, así que te invitamos a que veas un poco de Wolfenstein, un juego que ya tiene sus años, pero que levantaba muchas emociones en su momento:</p>
<p><iframe width="620" height="465" src="http://www.youtube.com/embed/C00n4rDUMNo?fs=1&#038;feature=oembed" frameborder="0" allowfullscreen></iframe></p>
<p>Si viste el video que te invitamos, te podrás dar cuenta que la temática es muy similar al juego que hoy te traemos, Modern Combat 2 de la empresa Gamelof que presenta en su página oficial el juego de la siguiente manera:</p>
<p><em>Termina</em><em> </em><em>lo</em><em> </em><em>que</em><em> </em><em>comenzaste.</em></p>
<p><em>En</em><em> </em><em>Modern</em><em> </em><em>Combat</em><em> </em><em>2:</em><em> </em><em>Black</em><em> </em><em>Pegasus,</em><em> </em><em>completa</em><em> </em><em>la</em><em> </em><em>misión</em><em> </em><em>desvelada</em><em> </em><em>en</em><em> </em><em>la</em><em> </em><em>primera</em><em> </em><em>parte</em><em> </em><em>de</em><em> </em><em>uno</em><em> </em><em>de</em><em> </em><em>los</em><em> </em><em>FPS</em><em> </em><em>más</em><em> </em><em>aclamados</em><em> </em><em>para</em><em> </em><em>Android,</em><em> </em><em>esta</em><em> </em><em>vez</em><em> </em><em>con</em><em> </em><em>frentes</em><em> </em><em>por</em><em> </em><em>todo</em><em> </em><em>el</em><em> </em><em>mundo.</em></p>
<p><em>Modern</em><em> </em><em>Combat</em><em> </em><em>2:</em><em> </em><em>Black</em><em> </em><em>Pegasus</em><em> </em><em>mejora</em><em> </em><em>el</em><em> </em><em>juego</em><em> </em><em>ya</em><em> </em><em>ejemplar</em><em> </em><em>del</em><em> </em><em>primer</em><em> </em><em>juego</em><em> </em><em>de</em><em> </em><em>Modern</em><em> </em><em>Combat</em><em> </em><em>con</em><em> </em><em>una</em><em> </em><em>asombrosa</em><em> </em><em>inmersión</em><em> </em><em>en</em><em> </em><em>una</em><em> </em><em>experiencia</em><em> </em><em>de</em><em> </em><em>guerra</em><em> </em><em>moderna</em><em> </em><em>y</em><em> </em><em>con</em><em> </em><em>uno</em><em> </em><em>de</em><em> </em><em>los</em><em> </em><em>modos</em><em> </em><em>multijugador</em><em> </em><em>FPS</em><em> </em><em>más</em><em> </em><em>completos</em><em> </em><em>para</em><em> </em><em>Android.</em></p>
<p>Y el video de presentación oficial del juego es el siguiente:</p>
<p><iframe width="620" height="349" src="http://www.youtube.com/embed/yMMPDSkk7Ao?fs=1&#038;feature=oembed" frameborder="0" allowfullscreen></iframe></p>
<p>No necesita mucha explicación este juego, cuentas con diferentes armas para luchar en diferentes misiones que te plantean a lo largo de los diferentes continentes, pero si eres de Colombia, el último capitulo te será muy familiar, así que si sabes a que nos referimos compártelo en los comentarios a ver si acertaste. Pero no solo se queda en las misiones, también tienen la posibilidad de jugar en línea tanto por internet como en red WiFi con amigos que tengas cerca, creando tus propios sesiones en los diferentes escenarios.</p>
<p style="text-align: center;"><a href="http://androideity.com/wp-content/uploads/2012/05/Modern-Combat-Android-1.png"><img class="aligncenter size-full wp-image-3339" style="margin-top: 20px; margin-bottom: 20px;" title="Modern Combat Android" src="http://androideity.com/wp-content/uploads/2012/05/Modern-Combat-Android-1.png" alt="" width="448" height="298" /></a></p>
<p> En la pantalla principal del juego encontrarás el joystick para desplazar al personaje principal por los diferentes escenarios, el botón de disparar, el de apuntar, el de agacharse, el de pausa, así como las diferentes opciones de armas, y las granadas o los gases lacrimógenos para dispersarse y distraer a tus oponentes. Para mover la vista principal debes desplazar tu dedo en la parte derecha de la pantalla y cuando te encuentras muy cerca a un oponente aparece la opción de acuchillar a tu oponente. Así que tienes mas de 7 controles que debes tener en cuenta para jugar y cumplir todas las misiones.</p>
<p style="text-align: center;"><a href="http://androideity.com/wp-content/uploads/2012/05/Modern-Combat-Android-2.png"><img class="aligncenter size-full wp-image-3340" style="margin-top: 20px; margin-bottom: 20px;" title="Modern Combat Android" src="http://androideity.com/wp-content/uploads/2012/05/Modern-Combat-Android-2.png" alt="" width="448" height="298" /></a></p>
<p> Lo que es más destacable de este grandioso juego es su modo multijugador en el cual puede jugar en línea hasta con 10 usuarios compañeros, y 10 oponentes, en diferentes misiones como rescata la bandera, batalla por equipos y desactivar la bomba. Sencillamente debes crear una cuenta en Gameloft, en donde en primera instancia tienes nivel 1 y a medida que vallas derrotando oponentes,  y ganando misiones, vas subiendo tu nivel y ganando mejores armas, de las 15 diferentes que tienes disponibles. No puedes dejar de probar este modo on-line porque es lo mejor de este juego, y siempre encontraras una sesión activa, o sino puedes crear la propia e invitar a tus amigos para que se unan. Mi nombre de usuario es JaimeYesidLeon, si nos encontramos y luchamos juntos.</p>
<p style="text-align: center;"><a href="http://androideity.com/wp-content/uploads/2012/05/Modern-Combat-Android-3.png"><img class="aligncenter size-full wp-image-3341" style="margin-top: 20px; margin-bottom: 20px;" title="Modern Combat Android" src="http://androideity.com/wp-content/uploads/2012/05/Modern-Combat-Android-3.png" alt="" width="448" height="298" /></a></p>
<p> El juego está calificado en la Play Store en 4.0, juego que lo pone entre los mejores de su categoría; hay que tener en cuenta que los problemas van a surgir si no tienes tu teléfono libre de cache, y si no tienes un buen espacio de memoria libre, además la memoria <strong><em>RAM</em></strong> del móvil debe estar libre en su mayor medida, y con esto nos referimos a que no estén muchas aplicaciones corriendo al tiempo. Para que tu juego funcione ok debe tener por lo menos Android 2.1, y al menos 600MB en memoria libre para la descarga de los datos adicionales. Los comentarios en las calificaciones en general son muy buenos, aunque también se encontrarán problemas inevitables:</p>
<p style="text-align: center;"><a href="http://androideity.com/wp-content/uploads/2012/05/Modern-Combat-Android-4.png"><img class="aligncenter size-full wp-image-3337" style="margin-top: 20px; margin-bottom: 20px;" title="Modern Combat Android" src="http://androideity.com/wp-content/uploads/2012/05/Modern-Combat-Android-4.png" alt="" width="448" height="248" /></a></p>
<p> <strong>Observaciones</strong><strong> </strong><strong>personales</strong></p>
<p>Después de comprar este genial juego, haber cumplido todas las misiones y estar jugando en línea por un muy buen tiempo, tengo que decir que es un juego excepcional, tan solo el intro hace que quieras cumplir todas las misiones a cabalidad lo más pronto posible; entras directamente en la historia que traes desde la primera entrega, además la manera en que se desarrolla el juego hace que te enfoques en la acción pura, te ponen de una vez en el campo de batalla y nada de entrenamientos aburridos, de una a lanzarte a cumplir tus misiones.</p>
<p>Los gráficos son magníficos no tienen nada que discutir, son muy realistas y acordes a cada misión que te es asignada, además el ambiente es bastante bueno animado con buenos efectos de guerra en vivo, y enemigos muy bien diferenciados. Y que tal el modo multijugador que te mostramos:</p>
<p><iframe width="620" height="349" src="http://www.youtube.com/embed/uQ05HS6MC4A?fs=1&#038;feature=oembed" frameborder="0" allowfullscreen></iframe></p>
<p>Como te decíamos, lo mejor del juego es su modo multijugador, eso sí es la guerra en vivo, no tienes chance alguno, es salir al campo a ayudar a tu equipo a derrotar a los malosos del equipo contrario, o rescatando la bandera que te han capturado, o cuando estás solo debes luchar contra cualquiera que se te aparezca en frente; y que decir cuando te reúnes con tus amigos y formas un grupo especial, es una locura completa que no quieres dejar de jugar.</p>
<p>Así que no dejes de vivir una experiencia de un juego muy bien logrado que te hará derrochar adrenalina y vencer al que se te pase por el frente, te dejamos el enlace para lo vayas directo a descargarlo.</p>
<p><strong>Descargalo directamente:</strong></p>
<p style="text-align: center;"><a title="Modern Combat Google Play" href="https://play.google.com/store/apps/details?id=com.gameloft.android.ANMP.GloftBPHM.ML&amp;feature=search_result#?t=W251bGwsMSwxLDEsImNvbS5nYW1lbG9mdC5hbmRyb2lkLkFOTVAuR2xvZnRCUEhNLk1MIl0." target="_blank"><img class="aligncenter size-full wp-image-3347" style="margin-top: 20px; margin-bottom: 20px;" title="Google-Play" src="http://androideity.com/wp-content/uploads/2012/05/Google-Play2.jpg" alt="" width="375" height="146" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src="http://feeds.feedburner.com/~r/androideity/~4/7ggvzYiP6bk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://androideity.com/2012/05/05/modern-combat-2-en-tu-android/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://androideity.com/2012/05/05/modern-combat-2-en-tu-android/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=modern-combat-2-en-tu-android</feedburner:origLink></item>
		<item>
		<title>La herramienta draw9patch del SDK de Android</title>
		<link>http://feedproxy.google.com/~r/androideity/~3/f0_3niVbE68/</link>
		<comments>http://androideity.com/2012/04/26/la-herramienta-draw9patch-del-sdk-de-android/#comments</comments>
		<pubDate>Thu, 26 Apr 2012 22:45:07 +0000</pubDate>
		<dc:creator>Condesa</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[conociendo Android]]></category>
		<category><![CDATA[desarrollo en android]]></category>
		<category><![CDATA[herramientas]]></category>
		<category><![CDATA[sdk]]></category>

		<guid isPermaLink="false">http://androideity.com/?p=3316</guid>
		<description><![CDATA[<a href="http://androideity.com/2012/04/26/la-herramienta-draw9patch-del-sdk-de-android/"><img align="left" hspace="5" width="100" height="100" src="http://androideity.com/wp-content/uploads/2012/04/9patch09-150x150.png" class="alignleft wp-post-image tfe" alt="" title="9patch09" /></a>El SDK de Android nos proporciona muchas herramientas que nos ayudarán a hacer más fácil la tarea de crear aplicaciones Android. La mayoría de las veces me he encontrado con las dudas comunes de &#8220;¿Cómo mejoro el diseño de mis &#8230; <a href="http://androideity.com/2012/04/26/la-herramienta-draw9patch-del-sdk-de-android/">Sigue leyendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a title="Imagen 9-patch" href="http://androideity.com/wp-content/uploads/2012/04/9patch09.png" target="_blank"><img class="aligncenter size-full wp-image-3331" style="margin-top: 10px; margin-bottom: 10px;" title="9patch09" src="http://androideity.com/wp-content/uploads/2012/04/9patch09.png" alt="" width="578" height="280" /></a></p>
<p>El SDK de Android nos proporciona muchas herramientas que nos ayudarán a hacer más fácil la tarea de crear aplicaciones Android. La mayoría de las veces me he encontrado con las dudas comunes de &#8220;¿Cómo mejoro el diseño de mis aplicaciones?&#8221;. Esta es una pregunta compleja porque involucra muchos <em>skills</em> y conocer cómo darle ese <em>look&amp;feel</em> que vaya con la idea de lo que hace nuestra aplicación.</p>
<p>En el desarrollo de cualquier aplicación móvil hay que tomar en cuenta siempre tener un diseñador en nuestro equipo que nos construya el arte de la aplicación y quien nos genere también los recursos (imágenes en su mayoría) que utilizaremos en las interfaces. Si bien esto es básico, también lo es conocer cómo preparar esas imágenes para que se muestren lo mejor posible en las distintas resoluciones y tamaños de pantalla de los dispositivos Android en donde correrá nuestra aplicación.</p>
<p><span id="more-3316"></span></p>
<p>Por esa razón, hoy te presento una herramienta del SDK de Android que te ayudará a que tus imágenes puedan conservar su calidad sin importar el tamaño de pantalla de tus dispositivos.</p>
<p>Esta herramienta se llama <strong>draw9patch</strong> y nos ayudará a generar archivos <strong>9-patch</strong> a partir de imágenes PNG. Pero, ¿qué son los archivos <strong>9-patch</strong>? Un gráfico <strong>9-patch</strong> es básicamente es una imagen de mapa de bits extensible, es decir, un tipo de imagen que Android puede cambiar de tamaño automáticamente para ajustarse a la vista a la que se le ha sido asignado como background.</p>
<p>Para que esto vaya quedando más claro, pasemos al ejemplo para que puedas aterrizar los alcances de esta herramienta.</p>
<p>1. Actualmente tengo un un proyecto llamado <em>Imagen9Patch</em> con la versión Android 2.1.</p>
<p>2. En la carpeta <em>drawable</em> he agregado dos imágenes que me servirán como fondo para un botón (para cuando se encuentre en su estado normal y cuando sea presionado por el usuario). Estas imágenes las puedes descargar desde <a href="http://dl.dropbox.com/u/12316307/drawable.rar" target="_blank">este link</a>. (En caso de no tener la carpeta <em>drawable</em>, tendrás que crearla en tu proyecto).</p>
<p>3. Para definir la imagen que se desplegará como fondo del botón según el estado del mismo, he creado un archivo XML dentro de la misma carpeta de <em>drawable</em> cuyo nombre es <em>fondo_boton.xml</em> y cuyo código puedes ver a continuación:</p>
<p style="text-align: center;"> <a title="Imagen 9-patch" href="http://androideity.com/wp-content/uploads/2012/04/9patch011.png" target="_blank"><img class="aligncenter size-full wp-image-3321" style="margin-top: 10px; margin-bottom: 10px;" title="9patch01" src="http://androideity.com/wp-content/uploads/2012/04/9patch011.png" alt="" width="707" height="212" /></a></p>
<p>4. Una vez definido esto, he agregado un archivo de estilos dentro de la carpeta <em>values</em>. Mi archivo se llama <em>styles.xml</em> y su contenido es el siguiente:</p>
<p style="text-align: center;"><a title="Imagen 9-patch" href="http://androideity.com/wp-content/uploads/2012/04/9patch02.png" target="_blank"><img class="aligncenter size-full wp-image-3322" style="margin-top: 10px; margin-bottom: 10px;" title="9patch02" src="http://androideity.com/wp-content/uploads/2012/04/9patch02.png" alt="" width="599" height="233" /></a></p>
<p>5. Por último, he modificado el archivo <em>main.xml</em> de la carpeta <em>res &gt; layout</em> para agregar los cuatro botones en la interfaz de usuario. El código de este archivo es el siguiente:</p>
<p style="text-align: center;"><a title="Imagen 9-patch" href="http://androideity.com/wp-content/uploads/2012/04/9patch03.png" target="_blank"><img class="aligncenter size-full wp-image-3323" style="margin-top: 10px; margin-bottom: 10px;" title="9patch03" src="http://androideity.com/wp-content/uploads/2012/04/9patch03.png" alt="" width="627" height="463" /></a></p>
<p>**Cada uno de los botones tiene un texto, por ello, por cada botón hay un elemento de cadena de texto dentro del archivo <em>strings.xml</em> del directorio <em>res &gt; values</em>.</p>
<p>6. El resultado es el siguiente:</p>
<p style="text-align: center;"><a title="Imagen 9-patch" href="http://androideity.com/wp-content/uploads/2012/04/9patch04.png" target="_blank"><img class="aligncenter size-full wp-image-3324" style="margin-top: 10px; margin-bottom: 10px;" title="9patch04" src="http://androideity.com/wp-content/uploads/2012/04/9patch04.png" alt="" width="479" height="175" /></a></p>
<p>Como puedes ver, los bordes de las imágenes se ven borrosas porque al parecer la imagen es más chica para el tamaño de los botones. La solución &#8220;más sencilla&#8221; sería pedirle a nuestro diseñador una imagen más grande para que el fondo de los botones mejorara su calidad en la pantalla pero hay otra solución: Utilizar imágenes <strong>9-patch</strong>.</p>
<p>Para crear estas imágenes será necesario abrir la herramienta <strong>Draw9Patch</strong> que se encuentra en el directorio /<strong><em>tools</em></strong> del SDK de Android. Se trata de un archivo <em><strong>.bat</strong></em>. Lo ejecutas y enseguida verás la siguiente pantalla:</p>
<p style="text-align: center;"><a title="Imagen 9-patch" href="http://androideity.com/wp-content/uploads/2012/04/9patch05.png" target="_blank"><img class="aligncenter size-large wp-image-3325" style="margin-top: 10px; margin-bottom: 10px;" title="9patch05" src="http://androideity.com/wp-content/uploads/2012/04/9patch05-1024x602.png" alt="" width="620" height="364" /></a></p>
<p>El primer paso es cargar la imagen que queremos convertir. Para ello, podemos arrastrar y soltar la imagen dentro de la ventana o bien ir a la opción <em>File &gt; Open 9-patch&#8230; </em>y elegir la imagen deseada.</p>
<p>Yo he elegido cargar la imagen <em>button.png</em> del ejemplo arriba mencionado. Cuando carguemos la imagen la pantalla se nos mostrará como sigue:</p>
<p><a href="http://androideity.com/wp-content/uploads/2012/04/9patch06.png"><img class="aligncenter size-large wp-image-3327" title="9patch06" src="http://androideity.com/wp-content/uploads/2012/04/9patch06-1024x601.png" alt="" width="620" height="363" /></a></p>
<p>En la parte principal tenemos nuestra imagen y nuestra área de trabajo donde aplicaremos los cambios necesarios. En la parte derecha se nos muestra la vista previa de cómo reaccionará nuestra imagen cuando el elemento se &#8220;estire&#8221; a lo ancho o a lo largo de la pantalla. Recuerda que estas imágenes las estamos ocupando como fondo de un botón, pero también pueden ser el fondo de un <em>TextView</em> o de cualquier otro elemento. En la parte inferior tenemos algunas herramientas como el zoom que nos permitirán tener mayor precisión al trabajar la imagen que hemos cargado.</p>
<p>Ahora bien, el chiste de la herramienta consiste en marcar líneas fuera del elemento y sobre un espacio que necesitemos que se expanda para ayudar a que la imagen no se vea pixelada. Cada vez que agreguemos una línea sobre la imagen podemos ver el resultado en la vista previa de la herramienta. Por ejemplo:</p>
<p style="text-align: center;"><a title="Imagen 9-patch" href="http://androideity.com/wp-content/uploads/2012/04/9patch07.png" target="_blank"><img class="aligncenter size-large wp-image-3328" style="margin-top: 10px; margin-bottom: 10px;" title="9patch07" src="http://androideity.com/wp-content/uploads/2012/04/9patch07-1024x604.png" alt="" width="620" height="365" /></a></p>
<p> En este caso he agregado cuatro líneas que representan el espacio que se repetirá para que las esquinas no se tengan que pixelear cuando el fondo se estire en un componente. Para poder visualizar las zonas que estará repitiendo Android cuando redimensione la imagen bastará con presionar el botón <em>Show bad patches/Hide bad patches</em> como te muestro a continuación:</p>
<p style="text-align: center;"><a title="Imagen 9-patch" href="http://androideity.com/wp-content/uploads/2012/04/9patch08.png" target="_blank"><img class="aligncenter size-large wp-image-3329" style="margin-top: 10px; margin-bottom: 10px;" title="9patch08" src="http://androideity.com/wp-content/uploads/2012/04/9patch08-1024x604.png" alt="" width="620" height="365" /></a></p>
<p>Cabe mencionar que las líneas negras que dibujamos son de un pixel, cuando queramos borrar alguna presionamos <em>Shift</em> y damos clic sobre la porción de la línea a borrar que se representa por cada uno de los cuadros que conforman nuestra área de trabajo. Sencillo, ¿cierto?.</p>
<p>Cuando ya estemos satisfechos con el resultado que se muestra en la vista previa podemos pasar a guardar la imagen con la opción <em>File &gt; Save 9-patch&#8230;</em> En este caso yo las llamaré tal cuál se llama la imagen original en PNG. Esta primera imagen entonces llevará el nombre de <em>button.9.png</em>.</p>
<p>Haré exactamente el mismo procedimiento para la segunda imagen para obtener <em>button_over.9.png</em>.</p>
<p>Cuando ya tenga las dos imágenes pasaré a agregarlas a mi proyecto. Para ello, deberás eliminar primero las imágenes que tienes actualmente en la carpeta drawable y posteriormente agregar las imágenes <strong>9-patch</strong>.</p>
<p>Ahora volvemos a ejecutar la aplicación y veremos cómo nuestra interfaz ya ha mejorado notablemente. Los botones ahora no se ven deformes y los bordes de los mismos tienen un mejor aspecto.</p>
<p style="text-align: center;"><a title="Imagen 9-patch" href="http://androideity.com/wp-content/uploads/2012/04/SC20120426-173306.png" target="_blank"><img class="aligncenter size-full wp-image-3330" style="margin-top: 10px; margin-bottom: 10px;" title="9-patch08" src="http://androideity.com/wp-content/uploads/2012/04/SC20120426-173306.png" alt="" width="480" height="202" /></a></p>
<p>Pues bien, este es el funcionamiento básico del uso de esta herramienta y que podemos utilizar en escenarios mucho más complej0s para lidiar con el rollo de las resoluciones de pantalla y también cuando tenemos elementos que variarán su tamaño según el contenido que tengan.</p>
<p>Espero que te sirva este tip, ya tienes una herramienta más para mejorar el aspecto de tus aplicaciones.</p>
<p>&nbsp;</p>
<p style="text-align: center;"><strong>¿Te gustó este post? ¡Compártelo!</strong></p>
<p>&nbsp;</p>
<img src="http://feeds.feedburner.com/~r/androideity/~4/f0_3niVbE68" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://androideity.com/2012/04/26/la-herramienta-draw9patch-del-sdk-de-android/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://androideity.com/2012/04/26/la-herramienta-draw9patch-del-sdk-de-android/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=la-herramienta-draw9patch-del-sdk-de-android</feedburner:origLink></item>
	</channel>
</rss>

