<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>Jon Segador</title>
	<atom:link href="http://jonsegador.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://jonsegador.com</link>
	<description>Desarrollador web, con todo lo que ello implica</description>
	<lastBuildDate>Wed, 07 Jul 2010 07:17:39 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Logs manuales y personalizados en Symfony</title>
		<link>http://jonsegador.com/2010/07/logs-manuales-personalizados-en-symfony/</link>
		<comments>http://jonsegador.com/2010/07/logs-manuales-personalizados-en-symfony/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 07:17:39 +0000</pubDate>
		<dc:creator>Jon</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[logs]]></category>

		<guid isPermaLink="false">http://jonsegador.com/?p=247</guid>
		<description><![CDATA[Suele ser una buena práctica tener un archivo de logs con las últimas acciones más importantes que se han hecho en nuestro sitio web: nuevo usuario registrado, se ha escrito un nuevo comentario, se ha editado o borrado un artículo, etc.
Symfony tiene un sistema de logs bastante decente, que nos informa de todo lo que [...]]]></description>
			<content:encoded><![CDATA[<p>Suele ser una buena práctica tener un archivo de logs con las últimas acciones más importantes que se han hecho en nuestro sitio web: nuevo usuario registrado, se ha escrito un nuevo comentario, se ha editado o borrado un artículo, etc.</p>
<p>Symfony tiene un sistema de logs bastante decente, que nos informa de todo lo que ocurre cada vez que cargamos una nueva página. Vamos a hacer algo sencillo: <strong>vamos a escribir nuestros propios mensajes de log personalizados y los escribiremos manualmente</strong> en el momento que consideremos oportuno y deseamos tener un control. Además, <strong>escribiremos estos logs en un archivo aparte</strong> del que utiliza Symfony por defecto. Así podremos leer directamente ese archivo sin tener otros logs mezclados con los que realmente nos interesa.</p>
<p>Primero, vamos a crear un nuevo archivo llamado CustomLog.class.php en la carpeta /lib/:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> CustomLog<span style="color: #009900;">&#123;</span>
  static <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> newLog<span style="color: #009900;">&#40;</span><span style="color: #000088;">$message</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #000088;">$logFile</span> <span style="color: #339933;">=</span> sfConfig<span style="color: #339933;">::</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'sf_log_dir'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/custom_logs.log'</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$custom_log</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> sfFileLogger<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> sfEventDispatcher<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'file'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$logFile</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$custom_log</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">info</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$message</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #009900;">&#125;</span>  
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>El archivo donde guardaremos nuestros logs personalizados, lo encontraremos en &#8220;/log/custom_logs.log&#8221;.</p>
<p>Para escribir un nuevo log desde cualquier parte del código, simplemente deberemos hacer:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">CustomLog<span style="color: #339933;">::</span><span style="color: #004000;">newLog</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Escribimos un nuevo log&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Si abrimos nuestro archivo de logs personalizados, encontraremos algo como esto:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">Jul <span style="color: #208080;">05</span> <span style="color: #cc66cc;">22</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">31</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">41</span> symfony <span style="color: #009900;">&#91;</span>info<span style="color: #009900;">&#93;</span> Escribimos un nuevo <span style="color: #990000;">log</span></pre></td></tr></table></div>

<p>Así podremos llevar un control de lo que ocurre en nuestra web.</p>
<p>Quizás haya una forma mejor de hacerlo. Si es así, no dudes en dejar tu propuesta en los comentarios. A lo mejor también sería conveniente escribir esas 3 lineas dentro de un try.. catch, por lo que pudiera pasar.</p>
]]></content:encoded>
			<wfw:commentRss>http://jonsegador.com/2010/07/logs-manuales-personalizados-en-symfony/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cambiar puerto 22 del servidor ssh</title>
		<link>http://jonsegador.com/2010/06/cambiar-puerto-22-servidor-ssh/</link>
		<comments>http://jonsegador.com/2010/06/cambiar-puerto-22-servidor-ssh/#comments</comments>
		<pubDate>Sat, 26 Jun 2010 17:50:13 +0000</pubDate>
		<dc:creator>Jon</dc:creator>
				<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[Servidores]]></category>
		<category><![CDATA[puerto]]></category>
		<category><![CDATA[servidor]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://jonsegador.com/?p=239</guid>
		<description><![CDATA[Si queremos tener más seguridad en nuestro servidor, un truco fácil es el de cambiar el puerto del servidor ssh. Por defecto, la conexión se hace en el puerto 22, que es uno de los puertos más utilizados por scripts maliciosos para realizar ataques por fuerza bruta o denegación de servicio.
Cambiar el puerto del ssh [...]]]></description>
			<content:encoded><![CDATA[<p>Si queremos tener más seguridad en nuestro servidor, un truco fácil es el de cambiar el puerto del servidor ssh. Por defecto, la conexión se hace en el puerto 22, que es uno de los puertos más utilizados por scripts maliciosos para realizar ataques por fuerza bruta o denegación de servicio.</p>
<p>Cambiar el puerto del ssh es tan sencillo como hacer lo siguiente:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">nano <span style="color: #339933;">/</span>etc<span style="color: #339933;">/</span>ssh<span style="color: #339933;">/</span>sshd_config</pre></td></tr></table></div>

<p>Editamos la linea dice</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#Port 22</span></pre></td></tr></table></div>

<p>La descomentamos (quitamos la almoadilla) y cambiamos el 22 por el puerto que queramos. Nos tenemos que asegurar de que el puerto que elijamos no esté ya en uso (Aquí tenemos una <a href="http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers">lista de puertos</a>). Por ejemplo, si elegimos el puerto 27, la línea quedará:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">Port <span style="color: #cc66cc;">27</span></pre></td></tr></table></div>

<p><span id="more-239"></span><br />
Ahora editamos el archivo /etc/services</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">nano <span style="color: #339933;">/</span>etc<span style="color: #339933;">/</span>services</pre></td></tr></table></div>

<p>buscamos las líneas:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">ssh         <span style="color: #cc66cc;">22</span><span style="color: #339933;">/</span>tcp
ssh         <span style="color: #cc66cc;">22</span><span style="color: #339933;">/</span>udp</pre></td></tr></table></div>

<p>y las cambiamos por el nuevo puerto que hemos seleccionado antes:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">ssh         <span style="color: #cc66cc;">27</span><span style="color: #339933;">/</span>tcp
ssh         <span style="color: #cc66cc;">27</span><span style="color: #339933;">/</span>udp</pre></td></tr></table></div>

<p>Ahora paramos e iniciamos el servidor ssh:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">/</span>etc<span style="color: #339933;">/</span>init<span style="color: #339933;">.</span>d<span style="color: #339933;">/</span>ssh stop</pre></td></tr></table></div>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">/</span>etc<span style="color: #339933;">/</span>init<span style="color: #339933;">.</span>d<span style="color: #339933;">/</span>ssh start</pre></td></tr></table></div>

<p>Y ya lo tenemos. A partir de ahora, cuando queramos acceder a nuestro servidor mediante ssh, deberemos especificar el puerto por el que nos queremos conectar. Por ejemplo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">ssh usuario<span style="color: #339933;">@</span>192<span style="color: #339933;">.</span>168<span style="color: #339933;">.</span>1<span style="color: #339933;">.</span>100 <span style="color: #339933;">-</span>p27</pre></td></tr></table></div>

<p>Puede que te salte algún error relacionado con las public keys. Es normal, ya que anteriormente ha detectado movimiento en el puerto 22. Simplemente hay que borrar esos public keys:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"> rm ~<span style="color: #339933;">/.</span>ssh<span style="color: #339933;">/</span>known_hosts</pre></td></tr></table></div>

<p>A partir de ahora tendremos nuestro servidor ssh un poco más seguro.</p>
]]></content:encoded>
			<wfw:commentRss>http://jonsegador.com/2010/06/cambiar-puerto-22-servidor-ssh/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfony: Migrar de Propel a Doctrine</title>
		<link>http://jonsegador.com/2010/06/symfony-migrar-de-propel-a-doctrine/</link>
		<comments>http://jonsegador.com/2010/06/symfony-migrar-de-propel-a-doctrine/#comments</comments>
		<pubDate>Fri, 18 Jun 2010 23:10:43 +0000</pubDate>
		<dc:creator>Jon</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://jonsegador.com/?p=208</guid>
		<description><![CDATA[Desde que empecé con Symfony siempre he preferido utilizar Propel como ORM de mis proyectos. Me sentía cómodo utilizándolo excepto en esas ocasiones en las que se complicaba demasiado la consulta y había que tirar de &#8216;criteriones&#8217; (al final optaba por construir la sql a mano). Había leído sobre Doctrine pero nunca me había parado [...]]]></description>
			<content:encoded><![CDATA[<p>Desde que empecé con Symfony siempre he preferido utilizar Propel como ORM de mis proyectos. Me sentía cómodo utilizándolo excepto en esas ocasiones en las que se complicaba demasiado la consulta y había que tirar de <em>&#8216;criteriones&#8217;</em> (al final optaba por construir la sql a mano). Había leído sobre Doctrine pero nunca me había parado a probarlo y utilizarlo ya que, como digo, me sentía muy cómodo con Propel y ni siquiera me planteaba cambiar.</p>
<p>En la nueva empresa donde trabajo (<a href="http://blackslot.com/">BlackSlot</a>) he empezado a utilizar Doctrine y, ante mi sorpresa, me ha encantado. Me he dado cuenta de que si sabes sql es muy fácil aprender Doctrine y con resultados muy buenos. Con Propel, aunque sepas sql, tienes que aprender a usarlo y pensar las conversiones desde sql a Propel. Es un lenguaje nuevo.</p>
<p>Ante este escenario y como tengo un proyecto recién empezado, me decidí a migrarlo de Propel a Doctrine.</p>
<p>Tengo que destacar que <strong>la migración es realmente costosa</strong>. Si no fuese por que acabo de empezar el proyecto y no está muy avanzado, hubiese tenido que seguir con Propel. Personalmente, lo que más cuesta es transformar todo el modelo a Doctrine (todo depende de cuanto lleves hecho). Si es un proyecto acabado y bastante elaborado, te puede llevar días. Al modelo hay que añadir el modificar el schema.yml con el formato apropiado para Doctrine.</p>
<p><strong>Otro quebradero de cabeza son los plugins</strong> en Propel que has utilizado en tu proyecto. El más típico es el sfGuardPlugin para llevar las cuentas de usuario. Tendrás que instalar el plugin sfDoctrineGuardPlugin que es el equivalente para Doctrine.</p>
<p>Si aún después de haber leído esto, sigues queriendo migrar de Propel a Doctrine un proyecto empezado, estos son los pasos que tienes que seguir:<br />
<span id="more-208"></span><br />
<strong>¡No te olvides de hacer un backup de todo primero!</strong></p>
<p><strong>1)</strong> Editamos el fichero config/ProjectConfiguration.class.php y añadimos esta línea con la que cargamos todos los plugins excepto el de Propel.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">enableAllPluginsExcept</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'sfPropelPlugin'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p><strong>2)</strong> Borrar directorio plugins/sfGuardPlugin si es que lo tenemos instalado.</p>
<p><strong>3)</strong> Borramos el actual schema de base de datos config/databases.yml<br />
y reconfiguramos el proyecto para utilizarlo con Doctrine</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">php symfony configure<span style="color: #339933;">:</span>database <span style="color: #339933;">--</span>name<span style="color: #339933;">=</span>doctrine <span style="color: #339933;">--</span><span style="color: #000000; font-weight: bold;">class</span><span style="color: #339933;">=</span>sfDoctrineDatabase <span style="color: #0000ff;">&quot;mysql:host=localhost;dbname=nombre_base_de_datos&quot;</span> usuario contraseña</pre></td></tr></table></div>

<p><strong>4)</strong> Ejecutamos:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">php symfony plugin<span style="color: #339933;">:</span>publish<span style="color: #339933;">-</span>assets</pre></td></tr></table></div>

<p>para crear un enlace a sfDoctrinePlugin en el directorio web.</p>
<p><strong>5)</strong> Borramos unos ficheros propios de Propel</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">rm web<span style="color: #339933;">/</span>sfPropelPlugin
rm config<span style="color: #339933;">/</span>propel<span style="color: #339933;">.</span>ini</pre></td></tr></table></div>

<p><strong>6)</strong> Como es un proyecto empezado, supongo que tienes una base de datos ya creada.</p>
<p>Creamos el directorio donde alojamos el schema.yml para Doctrine:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">mkdir</span> config<span style="color: #339933;">/</span>doctrine</pre></td></tr></table></div>

<p>Y con el siguiente comando, recreamos el schema a partir de la base de datos existente:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">php symfony doctrine<span style="color: #339933;">:</span>build<span style="color: #339933;">-</span>schema</pre></td></tr></table></div>

<p>No te olvides revisarlo, sobre todo las relaciones entre tablas.</p>
<p><strong>7)</strong>  Borramos el modelo anterior</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">rm <span style="color: #339933;">-</span>rf lib<span style="color: #339933;">/</span>model<span style="color: #666666; font-style: italic;">/*</span></pre></td></tr></table></div>

<p>Y lo volvemos a generar a partir del nuevo archivo schema.yml</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">symfony doctrine<span style="color: #339933;">:</span>build<span style="color: #339933;">-</span>model
symfony doctrine<span style="color: #339933;">:</span>build<span style="color: #339933;">-</span>forms
symfony doctrine<span style="color: #339933;">:</span>build<span style="color: #339933;">-</span>filters</pre></td></tr></table></div>

<p>A partir de aquí viene el trabajo duro: reescribir el modelo que teníamos en Propel y adaptarlo a Doctrine en las clases adecuadas del modelo.</p>
<p>También deberás instalar el plugin sfDoctrineGuardPlugin si lo estimas necesario (<a href="http://www.symfony-project.org/plugins/sfDoctrineGuardPlugin">http://www.symfony-project.org/plugins/sfDoctrineGuardPlugin</a>)</p>
<p>Espero que le pueda servir a alguien.</p>
]]></content:encoded>
			<wfw:commentRss>http://jonsegador.com/2010/06/symfony-migrar-de-propel-a-doctrine/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Aplicación Android: Webcams de tráfico en Vizcaya</title>
		<link>http://jonsegador.com/2010/03/aplicacion-android-webcams-de-trafico-en-vizcaya/</link>
		<comments>http://jonsegador.com/2010/03/aplicacion-android-webcams-de-trafico-en-vizcaya/#comments</comments>
		<pubDate>Tue, 23 Mar 2010 00:18:57 +0000</pubDate>
		<dc:creator>Jon</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Proyectos propios]]></category>

		<guid isPermaLink="false">http://jonsegador.com/?p=193</guid>
		<description><![CDATA[Aquí va otra aplicación para Android que nos será de especial utilidad a los conductores de Vizcaya. Se trata de poder consultar las webcams de trafico de vizcaya al instante y así poder conocer el estado de las carreteras antes de realizar un desplazamiento. Podremos evitar las carreteras congestionadas antes de llevarnos una sorpresa.
Se incluyen [...]]]></description>
			<content:encoded><![CDATA[<p>Aquí va otra aplicación para Android que nos será de especial utilidad a los conductores de Vizcaya. Se trata de poder <strong>consultar las webcams de trafico de vizcaya al instante</strong> y así poder conocer el estado de las carreteras antes de realizar un desplazamiento. Podremos evitar las carreteras congestionadas antes de llevarnos una sorpresa.</p>
<p>Se incluyen webcams tan relevantes como las de Bilbao, Txorierri, Barakaldo, autopista A8, Derio, Zamudio, Aeropuerto, Cruces, Zorroza, Max Center, etc.</p>
<p>No vuelvas a meterte en un atasco con tu coche, evita las retenciones.</p>
<p>Utiliza el siguiente código para descargarte la aplicación o busca &#8220;<strong>trafico vizcaya</strong>&#8221; en el Android Market.<br />
<img src="http://jonsegador.com/wp-content/qrcode_traficoVizcaya.png" alt="Tráfico Vizcaya" title="Tráfico Vizcaya" width="234" height="234" class="alignnone size-full wp-image-194" /></p>
<p>La aplicación de momento es un poco simple, si teneis alguna sugerencia no dudeis en dejarla en los comentarios. ¡Gracias!</p>
]]></content:encoded>
			<wfw:commentRss>http://jonsegador.com/2010/03/aplicacion-android-webcams-de-trafico-en-vizcaya/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aplicación para Android: apezz.com</title>
		<link>http://jonsegador.com/2010/03/aplicacion-para-android-apezz-com/</link>
		<comments>http://jonsegador.com/2010/03/aplicacion-para-android-apezz-com/#comments</comments>
		<pubDate>Sun, 14 Mar 2010 14:29:18 +0000</pubDate>
		<dc:creator>Jon</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Proyectos propios]]></category>

		<guid isPermaLink="false">http://jonsegador.com/?p=185</guid>
		<description><![CDATA[Ya podemos disfrutar de la aplicación para Android del agregador social de noticias, apezz.com. Podremos ver las últimas noticias publicadas y pendientes de la web, así como su descripción y un acceso directo a la web de la noticia para ampliar la información.
Es una primera versión básica. Las próximas actualizaciones serán:
- Loguearnos con nuestro usuario [...]]]></description>
			<content:encoded><![CDATA[<p>Ya podemos disfrutar de la aplicación para Android del agregador social de noticias, <a href="http://apezz.com">apezz.com</a>. Podremos ver las últimas noticias publicadas y pendientes de la web, así como su descripción y un acceso directo a la web de la noticia para ampliar la información.</p>
<p>Es una primera versión básica. Las próximas actualizaciones serán:<br />
- Loguearnos con nuestro usuario de la web.<br />
- Ver los comentarios a noticias.<br />
- Comentar noticias.<br />
- Votar noticias.</p>
<p>Una vez hechas estas actualizaciones, podremos interactuar con la web completamente desde la aplicación Android.</p>
<p>Para descargarla, solamente deberemos buscar &#8220;apezz&#8221; en el Android Market o a partir del siguiente código QR:<br />
<img src="http://jonsegador.com/wp-content/apezz-qrcode.png" alt="apezz-qrcode" title="apezz-qrcode" width="210" height="210" class="alignnone size-full wp-image-186" /></p>
]]></content:encoded>
			<wfw:commentRss>http://jonsegador.com/2010/03/aplicacion-para-android-apezz-com/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Mostrar/cargar imagen externa en una aplicación Android</title>
		<link>http://jonsegador.com/2010/03/mostrarcargar-imagen-externa-en-una-aplicacion-android/</link>
		<comments>http://jonsegador.com/2010/03/mostrarcargar-imagen-externa-en-una-aplicacion-android/#comments</comments>
		<pubDate>Thu, 11 Mar 2010 13:52:30 +0000</pubDate>
		<dc:creator>Jon</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[cargar]]></category>
		<category><![CDATA[imagen]]></category>
		<category><![CDATA[mostrar]]></category>
		<category><![CDATA[servidor]]></category>

		<guid isPermaLink="false">http://jonsegador.com/?p=176</guid>
		<description><![CDATA[Muchas veces nos encontramos con el problema de tener que cargar imagenes, que tenemos alojadas en un servidor externo, en nuestra aplicación Android. Las imágenes básicas las podemos incluir en la propia aplicación pero imágenes como, por ejemplo, los avatares de los usuarios los tenemos que cargar directamente desde el servidor.
Primero creamos el layout (main.xml):

1
2
3
4
5
6
7
8
9
10
11
&#60;?xml [...]]]></description>
			<content:encoded><![CDATA[<p>Muchas veces nos encontramos con el problema de tener que cargar imagenes, que tenemos alojadas en un servidor externo, en nuestra aplicación Android. Las imágenes básicas las podemos incluir en la propia aplicación pero imágenes como, por ejemplo, los avatares de los usuarios los tenemos que cargar directamente desde el servidor.</p>
<p>Primero creamos el layout (main.xml):</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #339933;">&lt;?</span>xml version<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;1.0&quot;</span> encoding<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;utf-8&quot;</span> <span style="color: #339933;">?&gt;</span>
<span style="color: #339933;">&lt;</span>LinearLayout xmlns<span style="color: #339933;">:</span>android<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;http://schemas.android.com/apk/res/android&quot;</span>
    android<span style="color: #339933;">:</span>orientation<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;vertical&quot;</span>
    android<span style="color: #339933;">:</span>layout_width<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;fill_parent&quot;</span>
    android<span style="color: #339933;">:</span>layout_height<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;fill_parent&quot;</span><span style="color: #339933;">&gt;</span> 
&nbsp;
 <span style="color: #339933;">&lt;</span>ImageView android<span style="color: #339933;">:</span>id<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;@+id/image_view&quot;</span>
    android<span style="color: #339933;">:</span>layout_width<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;wrap_content&quot;</span>
    android<span style="color: #339933;">:</span>layout_height<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;wrap_content&quot;</span> <span style="color: #339933;">/&gt;</span>
&nbsp;
<span style="color: #339933;">&lt;/</span>LinearLayout<span style="color: #339933;">&gt;</span></pre></td></tr></table></div>

<p>Ahora creamos la activity que cargará la imagen del servidor y la mostrará en el layout anterior (Main.java):</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.jonsegador.examples.externalimage</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.IOException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.net.HttpURLConnection</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.net.URL</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.graphics.Bitmap</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">android.graphics.BitmapFactory</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.widget.ImageView</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">android.widget.Toast</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> Main <span style="color: #000000; font-weight: bold;">extends</span> Activity <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> ImageView imageView<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> Bitmap loadedImage<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> imageHttpAddress <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;http://jonsegador.com/wp-content/apezz.png&quot;</span><span style="color: #339933;">;</span>            
&nbsp;
    @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>
        imageView <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;">image_view</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>       
        downloadFile<span style="color: #009900;">&#40;</span>imageHttpAddress<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000066; font-weight: bold;">void</span> downloadFile<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> imageHttpAddress<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">URL</span> imageUrl <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
            imageUrl <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">URL</span><span style="color: #009900;">&#40;</span>imageHttpAddress<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #003399;">HttpURLConnection</span> conn <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">HttpURLConnection</span><span style="color: #009900;">&#41;</span> imageUrl.<span style="color: #006633;">openConnection</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            conn.<span style="color: #006633;">connect</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            loadedImage <span style="color: #339933;">=</span> BitmapFactory.<span style="color: #006633;">decodeStream</span><span style="color: #009900;">&#40;</span>conn.<span style="color: #006633;">getInputStream</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            imageView.<span style="color: #006633;">setImageBitmap</span><span style="color: #009900;">&#40;</span>loadedImage<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><span style="color: #003399;">IOException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            Toast.<span style="color: #006633;">makeText</span><span style="color: #009900;">&#40;</span>getApplicationContext<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, <span style="color: #0000ff;">&quot;Error cargando la imagen: &quot;</span><span style="color: #339933;">+</span>e.<span style="color: #006633;">getMessage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</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>
            e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Por último, incluimos la Activity en el AndroidManifest.xml y damos permisos para acceder a internet.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #339933;">&lt;?</span>xml version<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;1.0&quot;</span> encoding<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;utf-8&quot;</span><span style="color: #339933;">?&gt;</span>
<span style="color: #339933;">&lt;</span>manifest xmlns<span style="color: #339933;">:</span>android<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;http://schemas.android.com/apk/res/android&quot;</span>
      <span style="color: #000000; font-weight: bold;">package</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;com.jonsegador.examples.externalimage&quot;</span>
      android<span style="color: #339933;">:</span>versionCode<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;1&quot;</span>
      android<span style="color: #339933;">:</span>versionName<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;1.0&quot;</span><span style="color: #339933;">&gt;</span>
    <span style="color: #339933;">&lt;</span>application android<span style="color: #339933;">:</span>icon<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;@drawable/icon&quot;</span> android<span style="color: #339933;">:</span>label<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;@string/app_name&quot;</span><span style="color: #339933;">&gt;</span>
        <span style="color: #339933;">&lt;</span>activity android<span style="color: #339933;">:</span>name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;.Main&quot;</span> android<span style="color: #339933;">:</span>label<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;@string/app_name&quot;</span><span style="color: #339933;">&gt;</span>
            <span style="color: #339933;">&lt;</span>intent<span style="color: #339933;">-</span>filter<span style="color: #339933;">&gt;</span>
                <span style="color: #339933;">&lt;</span>action android<span style="color: #339933;">:</span>name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;android.intent.action.MAIN&quot;</span> <span style="color: #339933;">/&gt;</span>
                <span style="color: #339933;">&lt;</span>category android<span style="color: #339933;">:</span>name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;android.intent.category.LAUNCHER&quot;</span> <span style="color: #339933;">/&gt;</span>
            <span style="color: #339933;">&lt;/</span>intent<span style="color: #339933;">-</span>filter<span style="color: #339933;">&gt;</span>
        <span style="color: #339933;">&lt;/</span>activity<span style="color: #339933;">&gt;</span>    
    <span style="color: #339933;">&lt;/</span>application<span style="color: #339933;">&gt;</span>
    <span style="color: #339933;">&lt;</span>uses<span style="color: #339933;">-</span>sdk android<span style="color: #339933;">:</span>minSdkVersion<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;3&quot;</span> <span style="color: #339933;">/&gt;</span>  
    <span style="color: #339933;">&lt;</span>uses<span style="color: #339933;">-</span>permission android<span style="color: #339933;">:</span>name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;android.permission.INTERNET&quot;</span> <span style="color: #339933;">/&gt;</span>
<span style="color: #339933;">&lt;/</span>manifest<span style="color: #339933;">&gt;</span></pre></td></tr></table></div>

<p>Y este debería de ser el resultado:<br />
<img src="http://jonsegador.com/wp-content/imagen_externa_android-199x300.png" alt="imagen_externa_android" title="imagen_externa_android" width="199" height="300" class="alignnone size-medium wp-image-180" /></p>
]]></content:encoded>
			<wfw:commentRss>http://jonsegador.com/2010/03/mostrarcargar-imagen-externa-en-una-aplicacion-android/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CentOS / Red Hat: Deshacer yum update (roll back)</title>
		<link>http://jonsegador.com/2010/03/centos-redhat-deshacer-yum-update-rollback/</link>
		<comments>http://jonsegador.com/2010/03/centos-redhat-deshacer-yum-update-rollback/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 12:05:23 +0000</pubDate>
		<dc:creator>Jon</dc:creator>
				<category><![CDATA[Servidores]]></category>
		<category><![CDATA[centos]]></category>
		<category><![CDATA[rollback]]></category>
		<category><![CDATA[update]]></category>
		<category><![CDATA[yum]]></category>

		<guid isPermaLink="false">http://jonsegador.com/?p=162</guid>
		<description><![CDATA[Es bastante importante tener actualizado nuestro servidor con los parches de seguridad más recientes. Puede que el sistema se actualice sin problemas&#8230; pero puede que no. En esos momentos es cuando desearíamos poder volver a la versión anterior de los paquetes que hemos actualizado.
Con el gestor de paquetes yum lo podemos hacer. Para ello, primero [...]]]></description>
			<content:encoded><![CDATA[<p>Es bastante importante tener actualizado nuestro servidor con los parches de seguridad más recientes. Puede que el sistema se actualice sin problemas&#8230; <strong>pero puede que no</strong>. En esos momentos es cuando desearíamos poder<strong> volver a la versión anterior de los paquetes que hemos actualizado</strong>.</p>
<p>Con el gestor de paquetes <strong>yum</strong> lo podemos hacer. Para ello, primero tenemos que modificar un par de archivos:</p>
<p>Añadimos esta linea al fichero <strong>/etc/yum.conf</strong></p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">tsflags</span>=repackage</pre></div></div>

<p>También deberemos añadir esta linea al archivo <strong>/etc/rpm/macros</strong> (si no existe, lo creamos)</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">%</span>_repackage_all_erasures <span style="color: #000000;">1</span></pre></div></div>

<p>La documentación de rpm no tiene ninguna referencia a la opción deshacer (rollback). Para volver a la versión de los paquetes anteriores a la actualización <strong>usaremos el comando rpm con el parametro &#8211;rollback</strong></p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">rpm <span style="color: #660033;">-Uhv</span> <span style="color: #660033;">--rollback</span> <span style="color: #ff0000;">'15:00'</span>
rpm <span style="color: #660033;">-Uhv</span> <span style="color: #660033;">--rollback</span> <span style="color: #ff0000;">'2 hours ago'</span>
rpm <span style="color: #660033;">-Uhv</span> <span style="color: #660033;">--rollback</span> <span style="color: #ff0000;">'december 31'</span>
rpm <span style="color: #660033;">-Uhv</span> <span style="color: #660033;">--rollback</span> <span style="color: #ff0000;">'yesterday'</span></pre></div></div>

<p>Es una buena idea activar el rollback por lo que pueda pasar. Ahora podremos ejecutar</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">yum update</pre></div></div>

<p>sin miedo a posibles incompatibilidades.</p>
]]></content:encoded>
			<wfw:commentRss>http://jonsegador.com/2010/03/centos-redhat-deshacer-yum-update-rollback/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tutorial Android paso a paso III: Desarrollo de la aplicación Notepad</title>
		<link>http://jonsegador.com/2010/02/tutorial-android-paso-a-paso-iii-desarrollo-de-la-aplicacion-notepad/</link>
		<comments>http://jonsegador.com/2010/02/tutorial-android-paso-a-paso-iii-desarrollo-de-la-aplicacion-notepad/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 09:48:32 +0000</pubDate>
		<dc:creator>Jon</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[aplicación]]></category>
		<category><![CDATA[notepad]]></category>

		<guid isPermaLink="false">http://jonsegador.com/?p=136</guid>
		<description><![CDATA[En este tercer y último post del tutorial, vamos a practicar el ciclo de vida de la aplicación, y como guardar y recuperar el estado de la aplicación.
Puedes ver los anteriores artículos:
Tutorial Android paso a paso I: Desarrollo de la aplicación Notepad
Tutorial Android paso a paso II: Desarrollo de la aplicación Notepad
Objetivos:
• Conocer los eventos [...]]]></description>
			<content:encoded><![CDATA[<p>En este tercer y último post del tutorial, vamos a practicar el ciclo de vida de la aplicación, y como guardar y recuperar el estado de la aplicación.</p>
<p>Puedes ver los anteriores artículos:<br />
<a href="http://jonsegador.com/2010/02/tutorial-android-paso-a-paso-desarrollo-aplicacion-notepad/">Tutorial Android paso a paso I: Desarrollo de la aplicación Notepad</a><br />
<a href="http://jonsegador.com/2010/02/tutorial-android-paso-a-paso-ii-desarrollo-de-la-aplicacion-notepad/">Tutorial Android paso a paso II: Desarrollo de la aplicación Notepad</a></p>
<p>Objetivos:<br />
• Conocer los eventos del ciclo de vida de la aplicación.<br />
• Tecnicas para mantener el estado de la aplicación.</p>
<h4><strong>Paso 1</strong></h4>
<p>La aplicación actual contiene algunos problemas. Para solucionarlo, vamos a mover la funcionalidad de edición de notas a la clase NoteEdit.</p>
<p>1. Eliminar el siguiente código de la clase NoteEdit, que obtiene los datos de la nota a través del Bundle. Vamos a pasar a utilizar la clase DBHelper para obtener los datos directamente de la base de datos.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">Bundle extras <span style="color: #339933;">=</span> getIntent<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getExtras</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
…
<span style="color: #003399;">String</span> title <span style="color: #339933;">=</span> extras.<span style="color: #006633;">getString</span><span style="color: #009900;">&#40;</span>NotesDbAdapter.<span style="color: #006633;">KEY_TITLE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003399;">String</span> body <span style="color: #339933;">=</span> extras.<span style="color: #006633;">getString</span><span style="color: #009900;">&#40;</span>NotesDbAdapter.<span style="color: #006633;">KEY_BODY</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
mRowId <span style="color: #339933;">=</span> extras.<span style="color: #006633;">getLong</span><span style="color: #009900;">&#40;</span>NotesDbAdapter.<span style="color: #006633;">KEY_ROWID</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>2. Además, eliminamos la asignación de los datos a la interfaz de usuario</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>title <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>
    mTitleText.<span style="color: #006633;">setText</span><span style="color: #009900;">&#40;</span>title<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>body <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>
    mBodyText.<span style="color: #006633;">setText</span><span style="color: #009900;">&#40;</span>body<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><span id="more-136"></span></p>
<h4><strong>Paso 2</strong></h4>
<p>Conectamos la clase NoteEdit con la base de datos.</p>
<p>1. Creamos un nuevo atributo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">private</span> NotesDbAdapter mDbHelper<span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>2. Conectamos con la base de datos en el constructor, justo después de llamar al constructor padre:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">mDbHelper <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> NotesDbAdapter<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
mDbHelper.<span style="color: #006633;">open</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<h4><strong>Paso 3</strong></h4>
<p>Pasamos a comprobar el estado de la variable savedInstanceState. Esto sirve para comprobar si tenemos datos guardados en el Bundle, que debemos recuperar (Esto ocurre si la actividad pierde el foco y después se recupera).</p>
<p>1. Reeplazar el siguiente código:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">mRowId <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
Bundle extras <span style="color: #339933;">=</span> getIntent<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getExtras</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;">if</span> <span style="color: #009900;">&#40;</span>extras <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>
    mRowId <span style="color: #339933;">=</span> extras.<span style="color: #006633;">getLong</span><span style="color: #009900;">&#40;</span>NotesDbAdapter.<span style="color: #006633;">KEY_ROWID</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Por este otro</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">mRowId <span style="color: #339933;">=</span> savedInstanceState <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span> <span style="color: #339933;">?</span> savedInstanceState.<span style="color: #006633;">getLong</span><span style="color: #009900;">&#40;</span>NotesDbAdapter.<span style="color: #006633;">KEY_ROWID</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>mRowId <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>
    Bundle extras <span style="color: #339933;">=</span> getIntent<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getExtras</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    mRowId <span style="color: #339933;">=</span> extras <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span> <span style="color: #339933;">?</span> extras.<span style="color: #006633;">getLong</span><span style="color: #009900;">&#40;</span>NotesDbAdapter.<span style="color: #006633;">KEY_ROWID</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h4><strong>Paso 4</strong></h4>
<p>Necesitamos completar los campos con los datos de la nota. Llamamos al método populateFields() que completaremos más adelante. Insertarlo justo antes de confirmButton.setOnClickListener():</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">populateFields<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<h4><strong>Paso 5</strong></h4>
<p>En esta actividad ya no es necesario devolver ningún tipo de datos, ya que vamos a guardar los datos directamente en esta actividad, por lo que es posible simplificar el método onClick() considerablemente:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> onClick<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>
    setResult<span style="color: #009900;">&#40;</span>RESULT_OK<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    finish<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Más adelante veremos como guardar los datos.</p>
<h4><strong>Paso 6</strong></h4>
<p>Definimos el método populateFields():</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> populateFields<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>mRowId <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;">Cursor</span> note <span style="color: #339933;">=</span> mDbHelper.<span style="color: #006633;">fetchNote</span><span style="color: #009900;">&#40;</span>mRowId<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        startManagingCursor<span style="color: #009900;">&#40;</span>note<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        mTitleText.<span style="color: #006633;">setText</span><span style="color: #009900;">&#40;</span>note.<span style="color: #006633;">getString</span><span style="color: #009900;">&#40;</span>note.<span style="color: #006633;">getColumnIndexOrThrow</span><span style="color: #009900;">&#40;</span>NotesDbAdapter.<span style="color: #006633;">KEY_TITLE</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        mBodyText.<span style="color: #006633;">setText</span><span style="color: #009900;">&#40;</span>note.<span style="color: #006633;">getString</span><span style="color: #009900;">&#40;</span>note.<span style="color: #006633;">getColumnIndexOrThrow</span><span style="color: #009900;">&#40;</span>NotesDbAdapter.<span style="color: #006633;">KEY_BODY</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: #009900;">&#125;</span></pre></td></tr></table></div>

<h4><strong>Paso 7</strong></h4>
<p>Implementamos los métodos que gestionan el ciclo de vida de Android. Estos métodos nos permiten guardar y recuperar el estado de la actividad en caso de que esta se cierre o pase a un segundo plano (al recibir una llamada, por ejemplo):</p>
<p>1. onSaveInstanceState(): es llamada por Android cuando la actividad va a ser cerrada. Esto significa que aquí se debe guardar toda la información necesaria para restaurar la actividad en su estado  anterior. Podemos pensar que es el método contrario a onCreate(), de hecho el Bundle que construimos en este método, es el que será pasado al método onCreate().</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">@Override
<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">void</span> onSaveInstanceState<span style="color: #009900;">&#40;</span>Bundle outState<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;">onSaveInstanceState</span><span style="color: #009900;">&#40;</span>outState<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    outState.<span style="color: #006633;">putLong</span><span style="color: #009900;">&#40;</span>NotesDbAdapter.<span style="color: #006633;">KEY_ROWID</span>, mRowId<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>2. onPause(): es llamada cuando la actividad va a terminar (con finish()) o pasar a un segundo plano (con una llamada de teléfono).</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">@Override
<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">void</span> onPause<span style="color: #009900;">&#40;</span><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;">onPause</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    saveState<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>3. onResume(): es llamada al reactivar la actividad. Completamos los campos:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">@Override
<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">void</span> onResume<span style="color: #009900;">&#40;</span><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;">onResume</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    populateFields<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h4><strong>Paso 8</strong></h4>
<p>Para terminar de completar la clase NoteEdit, ya solo nos queda guardar los datos en la base de datos. Creamos el método saveState():</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> saveState<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003399;">String</span> title <span style="color: #339933;">=</span> mTitleText.<span style="color: #006633;">getText</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: #003399;">String</span> body <span style="color: #339933;">=</span> mBodyText.<span style="color: #006633;">getText</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: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>mRowId <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: #000066; font-weight: bold;">long</span> id <span style="color: #339933;">=</span> mDbHelper.<span style="color: #006633;">createNote</span><span style="color: #009900;">&#40;</span>title, body<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>id <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            mRowId <span style="color: #339933;">=</span> id<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
        mDbHelper.<span style="color: #006633;">updateNote</span><span style="color: #009900;">&#40;</span>mRowId, title, body<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h4><strong>Paso 9</strong></h4>
<p>Volvemos a la clase Notepadv3. En el método onActivityResult(), teníamos implementado todo lo necesario para recibir los datos de la actividad y guardarla en la base de datos. Como este proceso ya lo realizamos en la clase NoteEdit, solo es necesario que actualizemos la lista con los nuevos datos:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">@Override
<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">void</span> onActivityResult<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> requestCode, <span style="color: #000066; font-weight: bold;">int</span> resultCode, Intent intent<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;">onActivityResult</span><span style="color: #009900;">&#40;</span>requestCode, resultCode, intent<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    fillData<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h4><strong>Paso 10</strong></h4>
<p>Finalmente, es esta misma clase, al seleccionar un elemento de la lista, ya no es ncesario pasar todos los datos de la nota, únicamente el id, por lo que el método onListItemClick(), quedaría de la siguiete manera:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">@Override
<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">void</span> onListItemClick<span style="color: #009900;">&#40;</span><span style="color: #003399;">ListView</span> l, <span style="color: #003399;">View</span> v, <span style="color: #000066; font-weight: bold;">int</span> position, <span style="color: #000066; font-weight: bold;">long</span> id<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;">onListItemClick</span><span style="color: #009900;">&#40;</span>l, v, position, id<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    Intent i <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Intent<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>, NoteEdit.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    i.<span style="color: #006633;">putExtra</span><span style="color: #009900;">&#40;</span>NotesDbAdapter.<span style="color: #006633;">KEY_ROWID</span>, id<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    startActivityForResult<span style="color: #009900;">&#40;</span>i, ACTIVITY_EDIT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Y con este último post hemos terminado el tutorial. Espero que os haya servido de ayuda y, como siempre, cualquier duda o pregunta en los comentarios.</p>
]]></content:encoded>
			<wfw:commentRss>http://jonsegador.com/2010/02/tutorial-android-paso-a-paso-iii-desarrollo-de-la-aplicacion-notepad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tutorial Android paso a paso II: Desarrollo de la aplicación Notepad</title>
		<link>http://jonsegador.com/2010/02/tutorial-android-paso-a-paso-ii-desarrollo-de-la-aplicacion-notepad/</link>
		<comments>http://jonsegador.com/2010/02/tutorial-android-paso-a-paso-ii-desarrollo-de-la-aplicacion-notepad/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 14:31:18 +0000</pubDate>
		<dc:creator>Jon</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[aplicación]]></category>
		<category><![CDATA[notepad]]></category>

		<guid isPermaLink="false">http://jonsegador.com/?p=119</guid>
		<description><![CDATA[Continuamos con la segunda parte del tutorial para el desarrollo de una aplicación para Android paso a paso. La primera parte la puedes consultar en Tutorial Android paso a paso I: Desarrollo de la aplicación Notepad.
En este segundo post, vamos a crear una segunda actividad que nos permita crear y editar notas. Además, vamos a [...]]]></description>
			<content:encoded><![CDATA[<p>Continuamos con la segunda parte del tutorial para el desarrollo de una aplicación para Android paso a paso. La primera parte la puedes consultar en <a href="http://jonsegador.com/2010/02/tutorial-android-paso-a-paso-desarrollo-aplicacion-notepad/">Tutorial Android paso a paso I: Desarrollo de la aplicación Notepad</a>.</p>
<p>En este segundo post, vamos a crear una segunda actividad que nos permita crear y editar notas. Además, vamos a poder tener la posibilidad de eliminar notas a través del un menú contextual.</p>
<p>Objetivos:<br />
  • Crear una nueva actividad.<br />
  • Realizar llamadas a la nueva actividad.<br />
  • Paso de datos entre las actividades.<br />
  • Crear un nuevo menu contextual.<br />
<span id="more-119"></span></p>
<h4><strong>Paso 1</strong></h4>
<p>Vamos a crear un menú contextual que nos permita eliminar las notas creadas por el usuario. Este menú se activará al seleccionar una nota:</p>
<p>1. Relacionamos la lista de notas (ListView) con el menu contextual:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">registerForContextMenu<span style="color: #009900;">&#40;</span>getListView<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>2. Creamos el menú contextual con la opción de eliminar una nota:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">@Override
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> onCreateContextMenu<span style="color: #009900;">&#40;</span>ContextMenu menu, <span style="color: #003399;">View</span> v, ContextMenuInfo menuInfo<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;">onCreateContextMenu</span><span style="color: #009900;">&#40;</span>menu, v, menuInfo<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    menu.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span>, DELETE_ID, <span style="color: #cc66cc;">0</span>, R.<span style="color: #006633;">string</span>.<span style="color: #006633;">menu_delete</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>3. Ahora que tenemos el menú creado y relacionado con el listado, tenemos que atender a las pulsaciones en el menú contextual:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">@Override
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> onContextItemSelected<span style="color: #009900;">&#40;</span><span style="color: #003399;">MenuItem</span> item<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">switch</span><span style="color: #009900;">&#40;</span>item.<span style="color: #006633;">getItemId</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>
        <span style="color: #000000; font-weight: bold;">case</span> DELETE_ID<span style="color: #339933;">:</span>
            AdapterContextMenuInfo info <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>AdapterContextMenuInfo<span style="color: #009900;">&#41;</span>
            item.<span style="color: #006633;">getMenuInfo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            mDbHelper.<span style="color: #006633;">deleteNote</span><span style="color: #009900;">&#40;</span>info.<span style="color: #006633;">id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            fillData<span style="color: #009900;">&#40;</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;">true</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">onContextItemSelected</span><span style="color: #009900;">&#40;</span>item<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h4><strong>Paso 2</strong></h4>
<p>Como hemos visto antes, vamos a dar la posibilidad al usuario de crear y editar notas. Para ello, necesitamos una actividad que controle la interfaz de usuario.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> NoteEdit <span style="color: #000000; font-weight: bold;">extends</span> Activity <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> EditText mTitleText<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> EditText mBodyText<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Long</span> mRowId<span style="color: #339933;">;</span>
&nbsp;
    @Override
    <span style="color: #000000; font-weight: bold;">protected</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;">note_edit</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        mTitleText <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>EditText<span style="color: #009900;">&#41;</span> findViewById<span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">id</span>.<span style="color: #006633;">title</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        mBodyText <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>EditText<span style="color: #009900;">&#41;</span> findViewById<span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">id</span>.<span style="color: #006633;">body</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #003399;">Button</span> confirmButton <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Button</span><span style="color: #009900;">&#41;</span> findViewById<span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">id</span>.<span style="color: #006633;">confirm</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        mRowId <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
        Bundle extras <span style="color: #339933;">=</span> getIntent<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getExtras</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;">if</span> <span style="color: #009900;">&#40;</span>extras <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;">String</span> title <span style="color: #339933;">=</span> extras.<span style="color: #006633;">getString</span><span style="color: #009900;">&#40;</span>NotesDbAdapter.<span style="color: #006633;">KEY_TITLE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #003399;">String</span> body <span style="color: #339933;">=</span> extras.<span style="color: #006633;">getString</span><span style="color: #009900;">&#40;</span>NotesDbAdapter.<span style="color: #006633;">KEY_BODY</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            mRowId <span style="color: #339933;">=</span> extras.<span style="color: #006633;">getLong</span><span style="color: #009900;">&#40;</span>NotesDbAdapter.<span style="color: #006633;">KEY_ROWID</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>title <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>
                mTitleText.<span style="color: #006633;">setText</span><span style="color: #009900;">&#40;</span>title<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;">if</span> <span style="color: #009900;">&#40;</span>body <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>
                mBodyText.<span style="color: #006633;">setText</span><span style="color: #009900;">&#40;</span>body<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
    confirmButton.<span style="color: #006633;">setOnClickListener</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">View</span>.<span style="color: #006633;">OnClickListener</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> onClick<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>
        Bundle bundle <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Bundle<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        bundle.<span style="color: #006633;">putString</span><span style="color: #009900;">&#40;</span>NotesDbAdapter.<span style="color: #006633;">KEY_TITLE</span>,
        mTitleText.<span style="color: #006633;">getText</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: #009900;">&#41;</span><span style="color: #339933;">;</span>
        bundle.<span style="color: #006633;">putString</span><span style="color: #009900;">&#40;</span>NotesDbAdapter.<span style="color: #006633;">KEY_BODY</span>,
        mBodyText.<span style="color: #006633;">getText</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: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>mRowId <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>
            bundle.<span style="color: #006633;">putLong</span><span style="color: #009900;">&#40;</span>NotesDbAdapter.<span style="color: #006633;">KEY_ROWID</span>, mRowId<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        Intent mIntent <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Intent<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        mIntent.<span style="color: #006633;">putExtras</span><span style="color: #009900;">&#40;</span>bundle<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        setResult<span style="color: #009900;">&#40;</span>RESULT_OK, mIntent<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        finish<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h4><strong>Paso 3</strong></h4>
<p>Ya tenemos la interfaz de usuario, y la actividad para controlarla. Vamos a abrir la nueva actividad desde el listado, para crear una nueva nota. Modificamos el método createNote() de la siguiente manera:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> createNote<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    Intent i <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Intent<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>, NoteEdit.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    startActivityForResult<span style="color: #009900;">&#40;</span>i, ACTIVITY_CREATE<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h4><strong>Paso 4</strong></h4>
<p>Para editar las notas ya creadas, creamos un evento para atender a las pulsaciones de los elementos de las listas. Pasamos los datos de la nota a la nueva actividad.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">@Override
<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">void</span> onListItemClick<span style="color: #009900;">&#40;</span><span style="color: #003399;">ListView</span> l, <span style="color: #003399;">View</span> v, <span style="color: #000066; font-weight: bold;">int</span> position, <span style="color: #000066; font-weight: bold;">long</span> id<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;">onListItemClick</span><span style="color: #009900;">&#40;</span>l, v, position, id<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003399;">Cursor</span> c <span style="color: #339933;">=</span> mNotesCursor<span style="color: #339933;">;</span>
    c.<span style="color: #006633;">moveToPosition</span><span style="color: #009900;">&#40;</span>position<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    Intent i <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Intent<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>, NoteEdit.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    i.<span style="color: #006633;">putExtra</span><span style="color: #009900;">&#40;</span>NotesDbAdapter.<span style="color: #006633;">KEY_ROWID</span>, id<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    i.<span style="color: #006633;">putExtra</span><span style="color: #009900;">&#40;</span>NotesDbAdapter.<span style="color: #006633;">KEY_TITLE</span>, c.<span style="color: #006633;">getString</span><span style="color: #009900;">&#40;</span>
    c.<span style="color: #006633;">getColumnIndexOrThrow</span><span style="color: #009900;">&#40;</span>NotesDbAdapter.<span style="color: #006633;">KEY_TITLE</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    i.<span style="color: #006633;">putExtra</span><span style="color: #009900;">&#40;</span>NotesDbAdapter.<span style="color: #006633;">KEY_BODY</span>, c.<span style="color: #006633;">getString</span><span style="color: #009900;">&#40;</span>
    c.<span style="color: #006633;">getColumnIndexOrThrow</span><span style="color: #009900;">&#40;</span>NotesDbAdapter.<span style="color: #006633;">KEY_BODY</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    startActivityForResult<span style="color: #009900;">&#40;</span>i, ACTIVITY_EDIT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h4><strong>Paso 5</strong></h4>
<p>Los métodos creados anteriormente createNote() y onListItemClick() nos devuelven datos, por lo que necesitamos un método para manejar la respuesta. onActivityResult() es el método ejecutado cuando una actividad devuelve resultados.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">@Override
<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">void</span> onActivityResult<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> requestCode, <span style="color: #000066; font-weight: bold;">int</span> resultCode, Intent intent<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;">onActivityResult</span><span style="color: #009900;">&#40;</span>requestCode, resultCode, intent<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    Bundle extras <span style="color: #339933;">=</span> intent.<span style="color: #006633;">getExtras</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>requestCode<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">case</span> ACTIVITY_CREATE<span style="color: #339933;">:</span>
            <span style="color: #003399;">String</span> title <span style="color: #339933;">=</span> extras.<span style="color: #006633;">getString</span><span style="color: #009900;">&#40;</span>NotesDbAdapter.<span style="color: #006633;">KEY_TITLE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #003399;">String</span> body <span style="color: #339933;">=</span> extras.<span style="color: #006633;">getString</span><span style="color: #009900;">&#40;</span>NotesDbAdapter.<span style="color: #006633;">KEY_BODY</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            mDbHelper.<span style="color: #006633;">createNote</span><span style="color: #009900;">&#40;</span>title, body<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            fillData<span style="color: #009900;">&#40;</span><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>
        <span style="color: #000000; font-weight: bold;">case</span> ACTIVITY_EDIT<span style="color: #339933;">:</span>
            <span style="color: #003399;">Long</span> rowId <span style="color: #339933;">=</span> extras.<span style="color: #006633;">getLong</span><span style="color: #009900;">&#40;</span>NotesDbAdapter.<span style="color: #006633;">KEY_ROWID</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>rowId <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;">String</span> editTitle <span style="color: #339933;">=</span> extras.<span style="color: #006633;">getString</span><span style="color: #009900;">&#40;</span>NotesDbAdapter.<span style="color: #006633;">KEY_TITLE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #003399;">String</span> editBody <span style="color: #339933;">=</span> extras.<span style="color: #006633;">getString</span><span style="color: #009900;">&#40;</span>NotesDbAdapter.<span style="color: #006633;">KEY_BODY</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            mDbHelper.<span style="color: #006633;">updateNote</span><span style="color: #009900;">&#40;</span>rowId, editTitle, editBody<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    fillData<span style="color: #009900;">&#40;</span><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>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h4><strong>Paso 6</strong></h4>
<p>La nueva actividad que hemos definido anteriormente, hay que añadirla a AndroidManifest.xml. Esto permite al sistema conocer los componentes de la aplicación.<br />
Eclipse include un editor para el manifiesto que facilita la edición del fichero AndroidManifest.xml. Para añadir una nueva actividad:</p>
<p>1. Abrir el fichero AndroidManifest.xml<br />
2. Seleccionar la pestaña Application.<br />
3. Pulsamos Add en la sección de Application Nodes.<br />
4. En el cuadro de diálogo, seleccionar &#8220;Create a new element at the top level, in Application&#8221; y Activity. Pulsar OK.<br />
5. Seleccionar la nueva actividad creada, y en el campo de texto Name, escribir .NoteEdit.</p>
<h4><strong>Paso 7</strong></h4>
<p>Ya hemos terminado esta segunda entrega del tutorial. Si ejecutamos la aplicación, editamos una nota y pulsamos el botón atrás, veremos que se produce un error. Veremos como solucionar estos  problemas en el siguiente post.</p>
<p><strong>Cualquier pregunta o duda (o corrección) en los comentarios.</strong></p>
<p>Ya puedes consultar la tercera parte del tutorial: <a href="http://jonsegador.com/2010/02/tutorial-android-paso-a-paso-iii-desarrollo-de-la-aplicacion-notepad/">Tutorial Android paso a paso III: Desarrollo de la aplicación Notepad</a></p>
]]></content:encoded>
			<wfw:commentRss>http://jonsegador.com/2010/02/tutorial-android-paso-a-paso-ii-desarrollo-de-la-aplicacion-notepad/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Tutorial Android paso a paso I: Desarrollo de la aplicación Notepad</title>
		<link>http://jonsegador.com/2010/02/tutorial-android-paso-a-paso-desarrollo-aplicacion-notepad/</link>
		<comments>http://jonsegador.com/2010/02/tutorial-android-paso-a-paso-desarrollo-aplicacion-notepad/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 20:29:07 +0000</pubDate>
		<dc:creator>Jon</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[aplicación]]></category>
		<category><![CDATA[notepad]]></category>

		<guid isPermaLink="false">http://jonsegador.com/?p=76</guid>
		<description><![CDATA[Me he decidido a hacer una serie de posts a modo de curso para empezar a desarrollar aplicaciones para Android. Voy a omitir la instalación del entorno de desarrollo (eclipse + sdk android) ya que existen numerosos manuales disponibles en internet. De todas formas, para instalarlo recomiendo este enlace. Después seguiremos los manuales disponibles en [...]]]></description>
			<content:encoded><![CDATA[<p>Me he decidido a hacer una serie de posts a modo de curso para empezar a desarrollar aplicaciones para Android. Voy a omitir la instalación del entorno de desarrollo (eclipse + sdk android) ya que existen numerosos manuales disponibles en internet. De todas formas, para instalarlo recomiendo <a href="http://groups.google.com/group/desarrolladores-android/web/instalando-el-entorno-de-desarrollo-y-primera-prueba">este enlace</a>. Después seguiremos los manuales disponibles en inglés en la web oficial de Android (<a href="http://developer.android.com/resources/tutorials/notepad/index.html">http://developer.android.com/resources/tutorials/notepad/index.html</a>), pero en castellano y con pasos muy fáciles de seguir (no será una traducción al pie de la letra).</p>
<p><strong>Nos deberemos descargar los ejemplos que encontraremos <a href="http://developer.android.com/resources/tutorials/notepad/codelab/NotepadCodeLab.zip">aquí</a> para seguir el curso</strong>.</p>
<p>Empezamos!</p>
<h4><strong>Desarrollo de la aplicación Notepad</strong></h4>
<p>A través de este tutorial vamos a crear una aplicación para tomar notas, que nos introducirá a los aspectos básicos y herramientas para el desarrollo en Android. Comenzando por un proyecto base, seguiremos los pasos  para crear una simple aplicación, viendo como desarrollar la lógica de negocio y las interfaces, así como compilar y ejecutar la aplicación.</p>
<p>En este ejercicio, vamos a construir una simple lista de notas, permitiendo al usuario añadir nuevas notas, pero no editarlas.</p>
<p>Objetivos:<br />
• Conocer ListActivities y crear menus de aplicación.<br />
• Utilizar SQLite para almacenar datos.<br />
• Cómo recuperar los datos de una base de datos y mostrarlos en pantalla.<br />
• Conceptos básicos sobre cómo interactuar con la interfaz de usuario.</p>
<p><span id="more-76"></span></p>
<h4><strong>Paso 1</strong></h4>
<p>1. Crear un nuevo proyecto Android File &gt; New &gt; Android Project<br />
2. En el cuadro de diálogo, seleccionar Create project from existing source<br />
3. Pulsar Browse y navegar hasta donde hemos descomprimido el material del curso (carpeta NotepadCodeLab) y seleccionar Notepadv1<br />
4. Las propiedades del proyecto deberían de completarse automáticamente.<br />
5. Pulsar Finish. El proyecto Notepadv1 debería abrirse y aparecer en el explorador de proyectos.</p>
<p>Si se produce algún error con AndroidManifest.xml, pulsar el botón derecho sobre el proyecto y seleccionar Android Tools &gt; Fix Project Properties.</p>
<h4><strong>Paso 2</strong></h4>
<p>Abrir el fichero notepad_list.xml en res/layout. Vamos a añadir los elementos necesarios para presentar la lista de notas. Podemos hacerlo de dos manera, añadir un ListView y un TextView desde el panel de elementos, o escribiendo el código directamente en el XML.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;utf-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;LinearLayout</span></span>
<span style="color: #009900;">      <span style="color: #000066;">xmlns:android</span>=<span style="color: #ff0000;">&quot;http://schemas.android.com/apk/res/android&quot;</span></span>
<span style="color: #009900;">      <span style="color: #000066;">android:layout_width</span>=<span style="color: #ff0000;">&quot;wrap_content&quot;</span></span>
<span style="color: #009900;">      <span style="color: #000066;">android:layout_height</span>=<span style="color: #ff0000;">&quot;wrap_content&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ListView</span> <span style="color: #000066;">android:layout_width</span>=<span style="color: #ff0000;">&quot;wrap_content&quot;</span></span>
<span style="color: #009900;">          <span style="color: #000066;">android:layout_height</span>=<span style="color: #ff0000;">&quot;wrap_content&quot;</span></span>
<span style="color: #009900;">          <span style="color: #000066;">android:id</span>=<span style="color: #ff0000;">&quot;@android:id/list&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/ListView<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
     <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;TextView</span> <span style="color: #000066;">android:layout_width</span>=<span style="color: #ff0000;">&quot;wrap_content&quot;</span></span>
<span style="color: #009900;">          <span style="color: #000066;">android:layout_height</span>=<span style="color: #ff0000;">&quot;wrap_content&quot;</span></span>
<span style="color: #009900;">          <span style="color: #000066;">android:text</span>=<span style="color: #ff0000;">&quot;@string/no_notes&quot;</span></span>
<span style="color: #009900;">          <span style="color: #000066;">android:id</span>=<span style="color: #ff0000;">&quot;@android:id/empty&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/TextView<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/LinearLayout<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Los elementos que hemos añadido se mostrarán alternativamente, es decir, solo uno de ellos será visible.<br />
• Los identificadores list y empty son proporcionados por la plataforma Android, por lo que tenemos que añadir el prefijo android: a los identificadores (@android:id/list).<br />
• La vista con el identificador empty, es usada automáticamente por Android cuando no existen elementos que mostrar.</p>
<h4><strong>Paso 3</strong></h4>
<p>Necesitamos mostrar las notas en el listado de notas, dentro del ListView.<br />
1. Crear un nuevo fichero llamado notes_row.xml dentro de res/layout.<br />
2. Añadir un nuevo TextView a la interfaz. Aplicarle el siguiente identificador: @+id/text1<br />
3. Guardar el fichero.</p>
<h4><strong>Paso 4</strong></h4>
<p>Vamos a modificar la clase Notepadv1 para mostrar el listado de nostas y que nos permita añadir nuevas notas. Abrimos el fichero Notepadv1.java.</p>
<p>• Debemos cambiar la clase a la que extiende (Activity) por ListActivity. Esta clase nos proporciona funcionalidades extra para trabajar con listas.<br />
• Vemos que existen varios métodos en el código:<br />
    onCreate(): se ejecuta cuando se llama a la actividad (puede verse como un método main).<br />
    onCreateOptionsMenu(): crea el menu de la actividad.<br />
    onOptionsItemSelected(): se ejecuta al seleccionar un elemento del menu.</p>
<h4><strong>Paso 5</strong></h4>
<p>Ahora que ya tenemos los componentes, ya podemos comenzar a construir la aplicación. Lo primero que vamos a hacer es abrir/crear la base de datos y asignar el resultado a la vista (ListView). Vamos a añadir el siguiente código al método onCreate():</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">@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>
    <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;">notepad_list</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    mDbHelper <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> NotesDbAdapter<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    mDbHelper.<span style="color: #006633;">open</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    fillData<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Definir la siguiente variable a nivel de clase:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">private</span> NotesDbAdapter mDbHelper <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Hemos definido un nuevo método, fillData(), que es el encargado de obtener todas las notas de la base de datos y asignárselas al ListView.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> fillData<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003399;">Cursor</span> c <span style="color: #339933;">=</span> mDbHelper.<span style="color: #006633;">fetchAllNotes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    startManagingCursor<span style="color: #009900;">&#40;</span>c<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> from <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#123;</span> NotesDbAdapter.<span style="color: #006633;">KEY_TITLE</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> to <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#123;</span> R.<span style="color: #006633;">id</span>.<span style="color: #006633;">text1</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    SimpleCursorAdapter notes <span style="color: #339933;">=</span>
        <span style="color: #000000; font-weight: bold;">new</span> SimpleCursorAdapter<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>, R.<span style="color: #006633;">layout</span>.<span style="color: #006633;">notes_row</span>, c, from, to<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    setListAdapter<span style="color: #009900;">&#40;</span>notes<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h4><strong>Paso 6</strong></h4>
<p>Vamos a crear el menu para que nos permita añadir nuevas notas a la lista.<br />
Necesitamos un botón que al ser pulsado cree una nueva nota:</p>
<p>1. Creamos el texto asociado al botón en res/values/strings.xml<br />
<img src="http://jonsegador.com/wp-content/uploads/android1.jpg" alt="android1" title="android1" width="625" height="199" class="alignnone size-full wp-image-95" /></p>
<p>2. Definimos la posición del botón en el menú:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">int</span> INSERT_ID <span style="color: #339933;">=</span> <span style="color: #003399;">Menu</span>.<span style="color: #006633;">FIRST</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>3. Añadimos el nuevo botón al menú:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">@Override
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> onCreateOptionsMenu<span style="color: #009900;">&#40;</span><span style="color: #003399;">Menu</span> menu<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">boolean</span> result <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">onCreateOptionsMenu</span><span style="color: #009900;">&#40;</span>menu<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    menu.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span>, INSERT_ID, <span style="color: #cc66cc;">0</span>, R.<span style="color: #006633;">string</span>.<span style="color: #006633;">menu_insert</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">return</span> result<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h4><strong>Paso 7</strong></h4>
<p>Una vez creado el menú, es necesario atender a las pulsaciones de los elementos del mismo. Aunque en este caso tengamos un único elemento, hay que tener en cuenta el elemento pulsado:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">@Override
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> onOptionsItemSelected<span style="color: #009900;">&#40;</span><span style="color: #003399;">MenuItem</span> item<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">switch</span> <span style="color: #009900;">&#40;</span>item.<span style="color: #006633;">getItemId</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>
        <span style="color: #000000; font-weight: bold;">case</span> INSERT_ID<span style="color: #339933;">:</span>
            createNote<span style="color: #009900;">&#40;</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;">true</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">onOptionsItemSelected</span><span style="color: #009900;">&#40;</span>item<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h4><strong>Paso 8</strong></h4>
<p>Creamos una nueva nota, la añadimos a la base de datos y actualizamos la lista para reflejar los cambios.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> createNote<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003399;">String</span> noteName <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">getString</span><span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">string</span>.<span style="color: #006633;">note_name</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot; &quot;</span> <span style="color: #339933;">+</span>
    <span style="color: #003399;">String</span>.<span style="color: #006633;">valueOf</span><span style="color: #009900;">&#40;</span>mNoteNumber<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    mDbHelper.<span style="color: #006633;">createNote</span><span style="color: #009900;">&#40;</span>noteName, <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    fillData<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h4><strong>Paso 9</strong></h4>
<p>Ya hemos acabado. Puedes importar el proyecto llamado Notepadv1Solution para comprobar que has hecho todo bien. Mañana más. Cualquier duda en los comentarios!</p>
<p>Segundo capítulo del tutorial: <a href="http://jonsegador.com/2010/02/tutorial-android-paso-a-paso-ii-desarrollo-de-la-aplicacion-notepad/">Tutorial Android paso a paso II: Desarrollo de la aplicación Notepad</a><br />
Tercer capítulo del tutorial: <a href="http://jonsegador.com/2010/02/tutorial-android-paso-a-paso-iii-desarrollo-de-la-aplicacion-notepad/">Tutorial Android paso a paso III: Desarrollo de la aplicación Notepad</a></p>
]]></content:encoded>
			<wfw:commentRss>http://jonsegador.com/2010/02/tutorial-android-paso-a-paso-desarrollo-aplicacion-notepad/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>
