<?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>Linux, Java y programación &#187; java</title>
	<atom:link href="http://casidiablo.net/category/programacion/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://casidiablo.net</link>
	<description>Blog de Java, Programación y Linux</description>
	<lastBuildDate>Fri, 11 Nov 2011 05:41:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Iniciar servicio en android después del boot</title>
		<link>http://casidiablo.net/iniciar-servicio-android-boot/</link>
		<comments>http://casidiablo.net/iniciar-servicio-android-boot/#comments</comments>
		<pubDate>Sun, 11 Jul 2010 18:08:00 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[tip]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3839</guid>
		<description><![CDATA[Esta entrada, principalmente dedicada a mi mismo ya que se que se me va a olvidar cómo hacerlo, indica paso a paso como crear un servicio en Android que se ejecute al iniciar el sistema. Como sabemos, un servicio es un proceso que se ejecuta en background aun cuando ningún componente visual de nuestra aplicación [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Finiciar-servicio-android-boot%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fcasidiablo.in%2FcJOgRT%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Iniciar%20servicio%20en%20android%20despu%C3%A9s%20del%20boot%22%20%7D);"></div>
<p>Esta entrada, principalmente dedicada a mi mismo ya que se que se me va a olvidar cómo hacerlo, indica paso a paso como crear un servicio en Android que se ejecute al iniciar el sistema. Como sabemos, un servicio es un proceso que se ejecuta en background aun cuando ningún componente visual de nuestra aplicación se encuentre activo.</p>
<p>La idea es más o menos sencilla: una vez que un sistema Android ha iniciado envía una acción broadcast llamada <code>android.intent.action.BOOT_COMPLETED</code>. La idea es crear un <code>BroadcastReceiver</code> que escuche este tipo de acciones e inicie el servicio que deseemos. Así pues, el primer paso es crear una clase que extienda <code>BroadcastReceiver</code>:</p>
<pre class="brush: java; title: ; notranslate">public class Recibidor extends BroadcastReceiver{
	@Override
	public void onReceive(Context context, Intent intent) {
		Intent servicio = new Intent();
		servicio.setAction(&quot;foo.bar.Servicio&quot;);
		context.startService(servicio);
	}
}</pre>
<p>Lo interesante aquí es que se ejecuta el método <code>startService</code> enviando como parámetro un <code>Intent</code> cuyo <em>action</em> es <em>&#8220;foo.bar.Servicio&#8221;</em>, el cual es el servicio que deseamos ejecutar. Dicho servicio es una clase que extiende de <code>Service</code>, y del cual debemos sobrescribir los métodos <code>onCreate</code> y <code>onStart</code>:</p>
<pre class="brush: java; title: ; notranslate">public class Servicio extends Service{

	private static final String TAG = &quot;EjemploServicioBoot&quot;;

	private Timer timer;

	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}

	@Override
	public void onCreate(){
		super.onCreate();
		Log.d(TAG, &quot;Servicio creado&quot;);
		timer = new Timer();
	}

	@Override
	public void onStart(final Intent intent, final int startId){
		super.onStart(intent, startId);
		timer.scheduleAtFixedRate(new TimerTask() {
			@Override
			public void run() {
				Log.i(TAG, &quot;Se ejecuta la tarea&quot;);
			}
		}, 0, 15000);
	}
}</pre>
<p>En este caso, el servicio realiza una tarea muy simple: imprime en el log del sistema un mensaje. Básicamente tenemos un objeto tipo <code>Timer</code> que ejecutará una tarea; en <code>onCreate</code> simplemente iniciamos el objeto <code>Timer</code>, mientras que en <code>onStart</code> usamos el método <code>scheduleAtFixedRate</code> indicando que ejecutaremos dicha tarea cada 15 segundos.</p>
<p>Por último, debemos registrar en el archivo <code>AndroidManifest.xml</code> el <code>BroadcastReceiver</code> y el servicio:</p>
<pre class="brush: xml; highlight: [12,17]; title: ; notranslate">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;manifest xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
      package=&quot;foo.bar&quot; android:versionCode=&quot;1&quot; android:versionName=&quot;1.0&quot;&gt;
    &lt;application&gt;
        &lt;service android:name=&quot;.Servicio&quot;&gt;
        	&lt;intent-filter&gt;
        		&lt;action android:name=&quot;foo.bar.Servicio&quot;/&gt;
        	&lt;/intent-filter&gt;
        &lt;/service&gt;
        &lt;receiver android:name=&quot;.Recibidor&quot;&gt;
        	&lt;intent-filter&gt;
        		&lt;action android:name=&quot;android.intent.action.BOOT_COMPLETED&quot;/&gt;
        	&lt;/intent-filter&gt;
        &lt;/receiver&gt;
    &lt;/application&gt;
    &lt;uses-sdk android:minSdkVersion=&quot;3&quot; /&gt;
    &lt;uses-permission android:name=&quot;android.permission.RECEIVE_BOOT_COMPLETED&quot; /&gt;
&lt;/manifest&gt;</pre>
<p>En el manifest podemos ver que añadimos un elemento <code>service</code> dentro de <code>application</code>, para registrar nuestro servicio. Y lo más interesante se ve en las líneas 12 y 17, que es donde indicamos el tipo de mensaje que nuestro recibidor estará esperando antes de ejecutar la tarea e indicamos que la aplicación requiere permisos para conocer cuando el boot del sistema a finalizado.</p>
<p><a class="descargacodigo" href="http://casidiablo.net/descargar/Servicio+Android" title="Descargar código fuente del ejemplo">Descargar código fuente</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/iniciar-servicio-android-boot/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
		<item>
		<title>Java por siempre</title>
		<link>http://casidiablo.net/java-por-siempre/</link>
		<comments>http://casidiablo.net/java-por-siempre/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 18:36:05 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[videos]]></category>
		<category><![CDATA[trailer]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3827</guid>
		<description><![CDATA[Sencillamente estupendo! Lo vi en java.no. Edito: un amable usuario a puesto un comentario con la versión subtitulada: http://www.youtube.com/watch?v=9g1y7f1xjJ0 muchísimas gracias!]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fjava-por-siempre%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fcasidiablo.in%2F9eM7nW%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Java%20por%20siempre%22%20%7D);"></div>
<p><center><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/KrfpnbGXL70&#038;hl=es_ES&#038;fs=1&#038;rel=0&#038;color1=0x3a3a3a&#038;color2=0x999999&#038;hd=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/KrfpnbGXL70&#038;hl=es_ES&#038;fs=1&#038;rel=0&#038;color1=0x3a3a3a&#038;color2=0x999999&#038;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object></center></p>
<p>Sencillamente estupendo! Lo vi en <a href="http://jz10.java.no/java-4-ever-trailer.html">java.no</a>. </p>
<p><strong>Edito:</strong> un amable usuario a puesto un comentario con la versión subtitulada: http://www.youtube.com/watch?v=9g1y7f1xjJ0 muchísimas gracias!</p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/java-por-siempre/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Reproducir clip de audio en Android</title>
		<link>http://casidiablo.net/reproducir-clip-de-audio-en-android/</link>
		<comments>http://casidiablo.net/reproducir-clip-de-audio-en-android/#comments</comments>
		<pubDate>Tue, 15 Jun 2010 00:50:06 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[reproducir]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3811</guid>
		<description><![CDATA[Esta receta es bastante simple para reproducir clips de audio en Android. Basta con usar el método create(context, int) de la clase MediaPlayer, pasándole como parámetro el actividad que desde donde se reproduce el sonido y la referencia al archivo de audio a reproducir. Tan sencillo como esto: En este caso, R.raw.slayer representa un archivo [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Freproducir-clip-de-audio-en-android%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fcasidiablo.in%2FaHJbmi%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Reproducir%20clip%20de%20audio%20en%20Android%22%20%7D);"></div>
<p>Esta receta es bastante simple para reproducir clips de audio en Android. Basta con usar el método <code>create(context, int)</code> de la clase <code>MediaPlayer</code>, pasándole como parámetro el actividad que desde donde se reproduce el sonido y la referencia al archivo de audio a reproducir. Tan sencillo como esto:</p>
<pre class="brush: java; highlight: [16,17]; title: ; notranslate">import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class TestSonido extends Activity {
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		Button boton = (Button) findViewById(R.id.reproducir);
		boton.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				MediaPlayer mp = MediaPlayer.create(TestSonido.this, R.raw.slayer);
				mp.start();
			}
		});
	}
}</pre>
<p>En este caso, <code>R.raw.slayer</code> representa un archivo de audio con nombre &#8220;slayer.mp3&#8243; almacenado en la carpeta <code>res/raw</code> y el sonido se reproduce al presionar el botón con id <code>reproducir</code>.</p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/reproducir-clip-de-audio-en-android/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Obtener dirección IP del WIFI en Android</title>
		<link>http://casidiablo.net/get-ip-android-wifi/</link>
		<comments>http://casidiablo.net/get-ip-android-wifi/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 15:43:07 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[obtener ip]]></category>
		<category><![CDATA[wifi]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3799</guid>
		<description><![CDATA[Este es un tip muy útil que permite obtener la dirección IP que tengamos asignada vía una conexión Wireless. Existen otras maneras de hacerlo, por ejemplo usando las clases WifiManager y WifiInfo, pero es mucho más confiable el método anterior. Además, este método funciona no solo en *Android*, sino en cualquier proyecto Java.]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fget-ip-android-wifi%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fcasidiablo.in%2Fcu6toh%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Obtener%20direcci%C3%B3n%20IP%20del%20WIFI%20en%20Android%22%20%7D);"></div>
<p style="text-align: center;"><img class="aligncenter" title="wifi" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/06/wifi.png" alt="" width="256" height="256" /></p>
<p style="text-align: justify;">Este es un tip muy útil que permite obtener la dirección IP que tengamos asignada vía una conexión Wireless.</p>
<pre class="brush: java; title: ; notranslate">public String getLocalIpAddress() {
    try {
        for (Enumeration&lt;NetworkInterface&gt; en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
            NetworkInterface intf = en.nextElement();
            for (Enumeration&lt;InetAddress&gt; enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                InetAddress inetAddress = enumIpAddr.nextElement();
                if (!inetAddress.isLoopbackAddress())
                    return inetAddress.getHostAddress().toString();
            }
        }
    } catch (SocketException ex) {}
    return null;
}</pre>
<p>Existen otras maneras de hacerlo, por ejemplo usando las clases <code>WifiManager</code> y <code>WifiInfo</code>, pero es mucho más confiable el método anterior. Además, este método funciona no solo en *Android*, sino en cualquier proyecto Java.</p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/get-ip-android-wifi/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Android: mostrar aplicaciones horizontalmente por defecto</title>
		<link>http://casidiablo.net/orientacion-ui-android/</link>
		<comments>http://casidiablo.net/orientacion-ui-android/#comments</comments>
		<pubDate>Tue, 11 May 2010 05:01:45 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3791</guid>
		<description><![CDATA[Este tip sirve para hacer que las aplicaciones no tengan el comportamiento habitual: cargarse y modificarse según la posición del dispositivo; sino hacer que siempre la orientación sea la misma. Esto es útil por ejemplo al momento de crear video juegos, en donde muchas veces es mejor mostrar todo horizontalmente para aprovechar mejor la pantalla. [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Forientacion-ui-android%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fcasidiablo.in%2F9PF965%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Android%3A%20mostrar%20aplicaciones%20horizontalmente%20por%20defecto%22%20%7D);"></div>
<p style="text-align: justify;">Este tip sirve para hacer que las aplicaciones no tengan el comportamiento habitual: cargarse y modificarse según la posición del dispositivo; sino hacer que siempre la orientación sea la misma. Esto es útil por ejemplo al momento de crear video juegos, en donde muchas veces es mejor mostrar todo horizontalmente para aprovechar mejor la pantalla.</p>
<p style="text-align: justify;">Para ello solo debemos agregar un par de atributos al XML de la actividad:</p>
<pre class="brush: xml; highlight: [3,4]; title: ; notranslate">&lt;activity android:name=&quot;.NombreActividad&quot;
                  android:label=&quot;el label&quot;
                  android:screenOrientation=&quot;landscape&quot;
                  android:configChanges=&quot;orientation&quot;&gt;
    &lt;intent-filter&gt;
        &lt;action android:name=&quot;android.intent.action.MAIN&quot; /&gt;
        &lt;category android:name=&quot;android.intent.category.LAUNCHER&quot; /&gt;
    &lt;/intent-filter&gt;
&lt;/activity&gt;</pre>
<p>Se puede también poner <code>android:screenOrientation="portrait"</code> para que sea siempre vertical.</p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/orientacion-ui-android/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Aplicaciones en pantalla completa con android</title>
		<link>http://casidiablo.net/fullscreen-android/</link>
		<comments>http://casidiablo.net/fullscreen-android/#comments</comments>
		<pubDate>Mon, 10 May 2010 04:01:03 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3783</guid>
		<description><![CDATA[Tip rápido para crear aplicaciones que ocupen toda la pantalla y no tengan barra de titulo. Para quitar la barra de título se invoca el método requestWindowFeature con el parámetro Window.FEATURE_NO_TITLE; para hacer que la aplicación aparezca en pantalla completa se invoca el método setFlags de la ventana, enviándole el parámetro WindowManager.LayoutParams.FLAG_FULLSCREEN:]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Ffullscreen-android%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fcasidiablo.in%2FbvG3bS%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Aplicaciones%20en%20pantalla%20completa%20con%20android%22%20%7D);"></div>
<p>Tip rápido para crear aplicaciones que ocupen toda la pantalla y no tengan barra de titulo. Para quitar la barra de título se invoca el método <code>requestWindowFeature</code> con el parámetro <code>Window.FEATURE_NO_TITLE</code>; para hacer que la aplicación aparezca en pantalla completa se invoca el método <code>setFlags</code> de la ventana, enviándole el parámetro <code>WindowManager.LayoutParams.FLAG_FULLSCREEN</code>:</p>
<pre class="brush: java; highlight: [10,11,12]; title: ; notranslate">import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

public class NombreActividad extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
        		WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.main);
    }
}</pre>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/fullscreen-android/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Construir aplicaciones Android desde la línea de comandos</title>
		<link>http://casidiablo.net/desarrollo-programas-android-consola/</link>
		<comments>http://casidiablo.net/desarrollo-programas-android-consola/#comments</comments>
		<pubDate>Sun, 09 May 2010 21:45:22 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[ide]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3776</guid>
		<description><![CDATA[Emacs es algo adictivo sin duda&#8230; a tal punto que a veces prefiero programar todo desde la línea de comandos en vez de usar un IDE como Eclipse o Netbans. En esta entrada, que sin duda es de esas que me sirve solo a mi y a unos pocos más, se detalla el proceso de [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fdesarrollo-programas-android-consola%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fcasidiablo.in%2Fb2O28Q%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Construir%20aplicaciones%20Android%20desde%20la%20l%C3%ADnea%20de%20comandos%22%20%7D);"></div>
<p style="float: left;"><img class="alignnone size-full wp-image-3781" title="android-open" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/05/android-open.png" alt="android consola" width="166" height="200" /></p>
<p style="text-align: justify;"><a href="http://www.gnu.org/software/emacs/">Emacs</a> es algo adictivo sin duda&#8230; a tal punto que a veces prefiero programar todo desde la línea de comandos en vez de usar un IDE como Eclipse o Netbans. En esta entrada, que sin duda es de esas que me sirve solo a mi y a unos pocos más, se detalla el proceso de compilación e instalación de aplicaciones para Android sin usar más que el SDK y una línea de comandos. Esta guía es aplicable para cualquier sistema operativo, pero yo lo haré en mi equipo que corre <a href="http://www.funtoo.org/">Funtoo Linux</a>.</p>
<p style="text-align: justify;">
<h3>0. Configuración del entorno de trabajo</h3>
</p>
<p style="text-align: justify;">Lo primero es tener el SDK instalado, lo cual está explicado aquí: <a href="http://casidiablo.net/tutorial-basico-android/">Introducción a la programación con Android</a>. Una vez hayamos instalado y configurado el SDK (incluyendo la adición del directorio tools al path del sistema) y tengamos un proyecto que compilar podemos iniciar el proceso de compilación. Es posible también crear el proyecto desde la línea de comandos así:</p>
<div class="consola">android create project -t 1 -p /tmp/ejemplo -k net.casidiablo.ejemplo -a Ejemplo</div>
<p style="text-align: justify;">Donde <code>-t 1</code> es el id de la plataforma para la que vamos a desarrollar la aplicación (el target). Se puede usar el comando <code>android list targets</code> para ver el listado de targets disponibles. <code>-p</code> indica la ruta de creación del proyecto y -a el nombre de la actividad inicial.</p>
<p style="text-align: justify;">
<h3>1. Compilación</h3>
</p>
<p style="text-align: justify;">Es posible usar Ant para compilar y empaquetar todo automáticamente&#8230; pero me gusta hacer cada cosa y saber qué está pasando por debajo. Así que haremos todo manualmente. El siguiente comando generará el archivo <code>R.java</code> (si no sabes de lo que hablo: <a href="../../tutorial-basico-android/">Introducción a  la programación con Android</a>):</p>
<div class="consola">aapt p -m -J src -M AndroidManifest.xml -S res -I $ANDROID_DIR/android.jar</div>
<ul>
<li><code>p</code> = package</li>
<li><code>-m -j src</code> indicar el directorio de los archivos fuente</li>
<li><code>-M</code> indicar la ubicación del manifiesto</li>
<li><code>-S</code> indicar la ubicación del directorio de recursos</li>
<li><code>-I $ANDROID_DIR/android.jar</code> añade el paquete android.jar al classpath del proyecto. Importante: en mi caso <code>$ANDROID_DIR</code> apunta a <code>/opt/android/platforms/<strong>android-4</strong>/</code> y en el path del sistema se encuentra incluido <code>/opt/android/platforms/android-4/tools/</code> Es importante tener en cuenta que NO se usa la base del SDK como antiguamente se hacía, sino el correspondiente directorio bajo <em>platforms</em>.</li>
</ul>
<p>Ahora sí vamos a generar los archivos <code>.class</code> (por supuesto, es necesario tener el JDK de Java instalado):</p>
<div class="consola">javac -encoding ascii -target 1.5 -d bin -bootclasspath $ANDROID_DIR/android.jar src/net/casidiablo/ejemplo/*.java</div>
<p>Esto básicamente genera archivos .class en el directorio bin. Si la aplicación usara librerías de terceros, se debería agregar el parámetro <code>-classpath=libs/*.jar</code></p>
<p>Puesto que los archivos .class están generados para la JVM, es necesario convertirlos a archivos para la Dalvik VM:</p>
<div class="consola">dx &#8211;dex &#8211;output=bin/classes.dex bin # si existieran librerías externas se añade libs/*.jar</div>
<p>Ahora empaquetamos los recursos:</p>
<div class="consola">aapt p -f -M AndroidManifest.xml -S res/ -I $ANDROID_DIR/android.jar -F bin/ejemplo.ap_</div>
<p>Ahora empaquetamos usando los bytecodes de Dalvik que creamos (classes.dex) para generar el paquete final:</p>
<div class="consola">apkbuilder bin/ejemplo.apk -z bin/ejemplo.ap_ -f bin/classes.dex -rf src -rj libs</div>
<p>Finalmente podemos instalarlo tal como escribí en <a href="http://casidiablo.net/android-desde-linux/">Manipulación de smartphones con Android desde la consola de Linux</a>:</p>
<div class="consola">adb install bin/ejemplo.apk</div>
<p>Links interesantes: <a href="http://asantoso.wordpress.com/2009/09/15/how-to-build-android-application-package-apk-from-the-command-line-using-the-sdk-tools-continuously-integrated-using-cruisecontrol/">How to build Android application package (.apk) from the command line using the SDK tools + continuously integrated using CruiseControl</a> y <a href="http://benlynn.blogspot.com/2009/01/developing-android-without-eclipse-or.html">Developing Android without Eclipse or Ant</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/desarrollo-programas-android-consola/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Añadir scroll a Actividades muy largas en Android</title>
		<link>http://casidiablo.net/scrollview-android/</link>
		<comments>http://casidiablo.net/scrollview-android/#comments</comments>
		<pubDate>Mon, 29 Mar 2010 02:05:53 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[activity]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[scroll]]></category>
		<category><![CDATA[scrollview]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3769</guid>
		<description><![CDATA[Cuando estamos creando interfaces gráficas en Android y la actividad en donde tenemos dicha interfaz es demasiado larga, Android no pone por defecto un scroll que permita navegar entre dicha interfaz. Para hacerlo, podemos usar la clase ScrollView: Es importante tener en cuenta que dentro de un componente de tipo ScrollView se debe poner UN, [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fscrollview-android%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fcasidiablo.in%2FcgPAZx%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22A%C3%B1adir%20scroll%20a%20Actividades%20muy%20largas%20en%20Android%22%20%7D);"></div>
<p style="text-align: justify;">Cuando estamos creando <a href="http://casidiablo.net/introduccion-ui-android/">interfaces gráficas en Android</a> y la actividad en donde tenemos dicha interfaz es demasiado larga, Android no pone por defecto un scroll que permita navegar entre dicha interfaz. Para hacerlo, podemos usar la clase <a class="external" href="http://developer.android.com/intl/de/reference/android/widget/ScrollView.html"><code>ScrollView</code></a>:</p>
<pre class="brush: xml; highlight: [9,10,47]; title: ; notranslate">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
	android:orientation=&quot;vertical&quot; android:layout_width=&quot;fill_parent&quot;
	android:layout_height=&quot;fill_parent&quot;&gt;
	&lt;TextView android:layout_width=&quot;fill_parent&quot;
		android:layout_height=&quot;wrap_content&quot; android:text=&quot;Un formulario muy largo&quot;
		android:textSize=&quot;20dp&quot; android:textColor=&quot;#ED0034&quot; /&gt;
	&lt;!-- inicia el ScrollView --&gt;
	&lt;ScrollView android:layout_width=&quot;fill_parent&quot;
		android:layout_height=&quot;fill_parent&quot;&gt;
		&lt;!-- se colocal el LinearLayout que contendra el formulario --&gt;
		&lt;LinearLayout android:orientation=&quot;vertical&quot;
			android:layout_width=&quot;fill_parent&quot; android:layout_height=&quot;fill_parent&quot;&gt;
			&lt;TextView android:text=&quot;Nombre&quot; android:layout_width=&quot;fill_parent&quot;
				android:layout_height=&quot;wrap_content&quot; /&gt;
			&lt;EditText android:layout_width=&quot;fill_parent&quot;
				android:layout_height=&quot;wrap_content&quot; /&gt;
			&lt;TextView android:text=&quot;Apellido&quot; android:layout_width=&quot;fill_parent&quot;
				android:layout_height=&quot;wrap_content&quot; /&gt;
			&lt;EditText android:layout_width=&quot;fill_parent&quot;
				android:layout_height=&quot;wrap_content&quot; /&gt;
			&lt;TextView android:text=&quot;Dirección&quot; android:layout_width=&quot;fill_parent&quot;
				android:layout_height=&quot;wrap_content&quot; /&gt;
			&lt;EditText android:layout_width=&quot;fill_parent&quot;
				android:layout_height=&quot;wrap_content&quot; /&gt;
			&lt;TextView android:text=&quot;Teléfono&quot; android:layout_width=&quot;fill_parent&quot;
				android:layout_height=&quot;wrap_content&quot; /&gt;
			&lt;EditText android:layout_width=&quot;fill_parent&quot;
				android:layout_height=&quot;wrap_content&quot; /&gt;
			&lt;TextView android:text=&quot;e-mail&quot; android:layout_width=&quot;fill_parent&quot;
				android:layout_height=&quot;wrap_content&quot; /&gt;
			&lt;EditText android:layout_width=&quot;fill_parent&quot;
				android:layout_height=&quot;wrap_content&quot; /&gt;
			&lt;TextView android:text=&quot;twiter&quot; android:layout_width=&quot;fill_parent&quot;
				android:layout_height=&quot;wrap_content&quot; /&gt;
			&lt;EditText android:layout_width=&quot;fill_parent&quot;
				android:layout_height=&quot;wrap_content&quot; /&gt;
			&lt;TextView android:text=&quot;País&quot; android:layout_width=&quot;fill_parent&quot;
				android:layout_height=&quot;wrap_content&quot; /&gt;
			&lt;EditText android:layout_width=&quot;fill_parent&quot;
				android:layout_height=&quot;wrap_content&quot; /&gt;
			&lt;TextView android:text=&quot;Ciudad&quot; android:layout_width=&quot;fill_parent&quot;
				android:layout_height=&quot;wrap_content&quot; /&gt;
			&lt;EditText android:layout_width=&quot;fill_parent&quot;
				android:layout_height=&quot;wrap_content&quot; /&gt;
		&lt;/LinearLayout&gt;
	&lt;/ScrollView&gt;
&lt;/LinearLayout&gt;</pre>
<p style="text-align: justify;">Es importante tener en cuenta que dentro de un componente de tipo ScrollView se debe poner UN, y SOLAMENTE UN, componente, en este caso un <a class="external" href="http://developer.android.com/intl/de/reference/android/widget/LinearLayout.html"><code>LinearLayout</code></a>.  Además, solo soporta scroll vertical. El resultado es algo  como esto:</p>
<p style="text-align: center;"><img class="size-full wp-image-3770 aligncenter" title="scrollview-android" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/scrollview-android.png" alt="" width="490" height="320" /></p>
<p style="text-align: justify;">En este caso he dejado un <a class="external" href="http://developer.android.com/reference/android/widget/TextView.html"><code>TextView</code></a> por fuera del scroll de tal manera que aparezca siempre&#8230; pero por supuesto podemos hacer que el scroll ocupe toda la pantalla.</p>
<p style="text-align: justify;"><a class="descargacodigo tooltip" title="Descargar proyecto eclipse comprimido" href="http://casidiablo.net/descargar/Ejemplo+ScrollView+Android">Descargar código fuente ejemplo</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/scrollview-android/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Depuración de aplicaciones en Android</title>
		<link>http://casidiablo.net/debug-programas-android/</link>
		<comments>http://casidiablo.net/debug-programas-android/#comments</comments>
		<pubDate>Thu, 25 Mar 2010 15:11:52 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[depuración]]></category>
		<category><![CDATA[log]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3749</guid>
		<description><![CDATA[Siguiendo con la serie de entradas sobre Android, aprenderemos a depurar de una manera sencilla las aplicaciones que escribamos. Muchas veces, al ejecutar la aplicación obtenemos un mensaje de este tipo: Cuando estamos desarrollando aplicaciones normales en Java, usualmente imprimimos mensajes en consola que contienen la información de las excepciones que capturamos, y que nos [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fdebug-programas-android%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fcasidiablo.in%2FcZuaM5%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Depuraci%C3%B3n%20de%20aplicaciones%20en%20Android%22%20%7D);"></div>
<p style="text-align: justify;">Siguiendo con la serie de entradas sobre Android, aprenderemos a depurar de una manera sencilla las aplicaciones que escribamos. Muchas veces, al ejecutar la aplicación obtenemos un mensaje de este tipo:</p>
<p style="text-align: center;"><img class="size-full wp-image-3750 aligncenter" title="android-broken" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/android-broken.png" alt="" width="253" height="334" /></p>
<p style="text-align: justify;">Cuando estamos desarrollando aplicaciones normales en Java, usualmente imprimimos mensajes en consola que contienen la información de las excepciones que capturamos, y que nos permiten detectar los errores. En Android tendremos hacer uso de la clase <code>Log</code>, que genera logs <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_rolleyes.gif' alt=':roll:' class='wp-smiley' />  (¡capitán obvio al rescate!).</p>
<p style="text-align: justify;">Su uso es bastante simple. Como ejemplo usemos este programa que arrojaría un famoso <code>NullPointerException</code>:</p>
<p style="text-align: justify;">
<pre class="brush: java; highlight: [11,12,13,14,15]; title: ; notranslate">package net.casidiablo.ejemplo;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class EjemploInvertir extends Activity {
	@Override
	public void onCreate(Bundle b) {
		super.onCreate(b);
		setContentView(R.layout.interfaz_grafica);
		String x = null;
		try {
			x.length();
		} catch (Exception e) {
			Log.d(&quot;Al inicio&quot;, &quot;El error es: &quot;+e.toString());
		}
	}
}</pre>
<p style="text-align: justify;">En este caso se usó el método <strong><code>d</code></strong> de la clase <code>Log</code>, el cual genera mensajes de tipo <code>DEBUG</code>. Existen otros como <strong><code>v</code></strong>, para <code>VERBOSE</code>, <code><strong>e</strong></code> para <code>ERROR</code>, etc. La lista completa la encuentras en el <a href="http://developer.android.com/intl/de/reference/android/util/Log.html" class="external">API de la clase</a>.</p>
<p style="text-align: justify;">Para leer el registro de errores desde Eclipse vamos a <em>Window</em> -&gt; <em>Show view</em> -&gt; <em>Other&#8230;</em> Dentro del cuadro de diálogo que se abre seleccionamos <em>Android</em> -&gt; <em>Logcat</em>:</p>
<p style="text-align: center;"><img src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/log-cat-android.png" alt="" title="log-cat-android" width="681" height="186" class="alignnone size-full wp-image-3751" /></p>
<p style="text-align: justify;">Espero que les sea de ayuda. No duden en comentar sus dudas o sugerencias.</p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/debug-programas-android/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Conceptos básicos de interfaces gráficas con Android</title>
		<link>http://casidiablo.net/introduccion-ui-android/</link>
		<comments>http://casidiablo.net/introduccion-ui-android/#comments</comments>
		<pubDate>Wed, 24 Mar 2010 13:04:42 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[button]]></category>
		<category><![CDATA[edittext]]></category>
		<category><![CDATA[eventos]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[interfaz grafica]]></category>
		<category><![CDATA[textview]]></category>
		<category><![CDATA[tip]]></category>
		<category><![CDATA[toast]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3715</guid>
		<description><![CDATA[En esta entrada vamos a introducirnos en el desarrollo de interfaces gráficas para Android. Haremos un sencillo ejemplo paso a paso en donde la idea es que comprenda la filosofía con la que se trabaja al usar widgets y actividades. El resultado será una aplicación sencilla que pide una cadena de texto al usuario y [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fcasidiablo.net%252Fintroduccion-ui-android%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fcasidiablo.in%2FcFUGgM%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Conceptos%20b%C3%A1sicos%20de%20interfaces%20gr%C3%A1ficas%20con%20Android%22%20%7D);"></div>
<p style="text-align: justify;"><img style="float: left; margin: 4px;" title="casidiablo-android" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/casidiablo-android1.png" alt="" />En esta entrada vamos a introducirnos en el desarrollo de interfaces gráficas para Android. Haremos un sencillo ejemplo paso a paso en donde la idea es que comprenda la filosofía con la que se trabaja al usar widgets y actividades. El resultado será una aplicación sencilla que pide una cadena de texto al usuario y la invierte. Es importante que ya tengas configurado el SDK y el Eclipse como se explica en <em><a href="http://casidiablo.net/tutorial-basico-android/">Introducción a la programación con Android</a></em>; aprenderemos a usar labels, cajas de texto, botones y eventos <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_cool.gif' alt='8-)' class='wp-smiley' /> </p>
<p style="text-align: justify;">Puesto que es la primera entrada de este tipo, voy a explicar detalladamente cada paso. En las siguientes iré un poco más rápido. Así que, si ya tiene experiencia con Android tal vez se aburra un poco <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_neutral.gif' alt=':-|' class='wp-smiley' /> </p>
<p><span id="more-3715"></span></p>
<h3>0. Crear un nuevo proyecto</h3>
<p style="text-align: justify;">Abrimos Eclipse y creamos un nuevo proyecto para Android:</p>
<p style="text-align: center;"><img class="aligncenter" title="Nuevo Proyecto ANdroid" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/nuevo-proyecto-android.png" alt="Nuevo Proyecto ANdroid" width="503" height="274" /></p>
<p style="text-align: justify;">Configuramos el proyecto de tal manera que quede así:</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-3718" title="proyecto-android" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/proyecto-android.png" alt="" width="600" height="635" /></p>
<p style="text-align: justify;">En este caso estoy usando la versión 1.6 de Android, pero puede escoger la versión que concuerde con el dispositivo sobre el que desea probar la aplicación. Esto se explica con más detalle en <em><a href="http://casidiablo.net/tutorial-basico-android/">Introducción a  la programación con Android</a></em>. Fíjese que no hemos creado ninguna actividad inicialmente (el checkbox <em>Create Activity</em> no está seleccionado); la idea es ver cómo se deben crear las actividades, los layouts con la interfaz gráfica, las clases que referencian a las actividades y la configuración del <code>AndroidManifest.xml</code>.</p>
<p style="text-align: justify;">
<h3>1. Crear y configurar una Actividad inicial</h3>
</p>
<p>Creamos una clase dentro del paquete <code>net.casidiablo.ejemplo</code>:</p>
<p style="text-align: center;"><img class="size-full wp-image-3719 aligncenter" title="nueva-clase" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/nueva-clase.png" alt="" width="598" height="264" /></p>
<p style="text-align: justify;">Y en el asistente de creación de clases de Eclipse le damos como nombre EjemploInvertir. Clic en <em>Finish</em> y editamos la clase para que luzca así:</p>
<pre class="brush: java; title: ; notranslate">package net.casidiablo.ejemplo;
import android.app.Activity;
import android.os.Bundle;
public class EjemploInvertir extends Activity{
    @Override
    public void onCreate(Bundle b){
        super.onCreate(b);
        setContentView(R.layout.main);
    }
}</pre>
<p style="text-align: justify;">Lo que hemos hecho es extender la clase <a class="external" href="http://developer.android.com/intl/de/reference/android/app/Activity.html"><code>Activity</code></a> y redefinir el método <code>onCreate</code>. Además, ejecutamos el método <code>setContentView</code> indicándole que usaremos el layout <code>main.xml</code> (Si tiene esta expresión en el rostro: <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_twisted.gif' alt=':twisted:' class='wp-smiley' />  es que no ha leído la entrada de <a href="http://casidiablo.net/tutorial-basico-android/">introducción  Android</a>).</p>
<p style="text-align: justify;">Puesto que deseamos que esta actividad sea mostrada al momento de ejecutar la aplicación, debemos editar el archivo <code>AndroidManifest.xml</code>, que se encuentra en la raíz del proyecto. Al hacer doble clic sobre este, vemos que es posible editarlo usando una interfaz gráfica. Para añadir la actividad que acabamos de crear, hacemos clic en la pestaña inferior <em>Application</em>, y en la sección <em>Application Nodes</em> hacemos clic en <em>Add&#8230;</em> Allí seleccionamos <em>Activity</em> y hacemos clic en <em>OK</em>.</p>
<p style="text-align: center;"><img class="size-full wp-image-3721 aligncenter" title="aniadir-android-activity" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/aniadir-android-activity.png" alt="" width="600" height="427" /></p>
<p style="text-align: justify;">Ahora debemos configurar la actividad. En la parte derecha ha aparecido un formulario llamado <em>Attributes for Activity</em>, en donde podremos hacerlo. Lo más importante es el nombre de la actividad, el cual debe ser el nombre de la clase que acabamos de crear. Es posible usar el botón <em>Browse&#8230;</em> para buscar las actividades actualmente disponibles&#8230;</p>
<p style="text-align: center;"><img class="size-full wp-image-3723 aligncenter" title="browse-activities" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/browse-activities.png" alt="" width="462" height="314" /></p>
<p style="text-align: justify;">Una vez hayamos seleccionado o escrito el nombre de la clase, debemos añadirle un <a href="http://developer.android.com/intl/de/reference/android/content/Intent.html" class="external"><code>Intent</code></a>; pero&#8230; ¿qué es un <code>Intent</code> <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_twisted.gif' alt=':twisted:' class='wp-smiley' /> ? Los componentes de una aplicación en Android se comunican a través de mensajes llamados <em>Intents</em> (objetos de la clase <code>android.content.Intent</code>). Se trata de una estructura de datos pasiva que contiene una descripción abstracta de una operación que será realizada, y se usa comúnmente para iniciar actividades <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_eek.gif' alt='8-O' class='wp-smiley' /> Sí ya se, es algo confuso al principio, pero de momento no es demasiado importante (más información <a class="external" href="http://developer.android.com/intl/de/guide/topics/intents/intents-filters.html">aquí</a>). Para añadir el <em>intent</em>, seleccionamos la actividad que acabamos de crear y hacemos clic en el botón <em>Add&#8230;</em> Seleccionamos <em>Intent Filter</em>, hacemos clic en <em>OK</em>. Y ahora, dentro del <code>Intent</code> crearemos dos componentes un <code>Action</code> y un <code>Category</code>.</p>
<p style="text-align: justify;">Un <code>Action</code> es un String que contiene el nombre de la acción a ser realizada. En este caso, el Action será <code>android.intent.action.MAIN</code>, el cual es usado para ejecutar la primera actividad de una aplicación. Entonces, seleccionamos el <code>Intent Filter</code> que acabamos de crear, y hacemos clic en <em>Add&#8230;</em> escogemos <em>Action</em>, clic en <em>OK</em> y escogemos el nombre del Action:</p>
<p style="text-align: center;"><img class="size-full wp-image-3725 aligncenter" title="action-android" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/action-android.png" alt="" width="600" height="146" /></p>
<p style="text-align: justify;"><code>Category</code> es un String que contiene información adicional acerca del tipo de componente que debería manipular el <code>Intent</code>. En este caso el <code>Category</code> que añadiremos será <code>CATEGORY_LAUNCHER</code> el cual indica que la actividad puede ser la principal (la que se ejecuta al iniciar la aplicación). Luego de añadir el <code>Category</code> veremos que queda así:</p>
<p style="text-align: center;"><img class="size-full wp-image-3726 aligncenter" title="category-android" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/category-android.png" alt="" width="600" height="135" /></p>
<p style="text-align: justify;">Hacemos clic en el icono de guardar en la barra de herramientas y listo <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  También es posible editar el archivo <code>AndroidManifest.xml</code> a mano, lo cual pienso que es mucho más rápido. Pero no esta de más saber cómo hacerlo con la interfaz gráfica <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  Si abrimos el archivo con el editor de XML veremos:</p>
<pre class="brush: xml; title: ; notranslate">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;manifest xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    package=&quot;net.casidiablo.ejemplo&quot; android:versionCode=&quot;1&quot;
    android:versionName=&quot;1.0&quot;&gt;
    &lt;application android:icon=&quot;@drawable/icon&quot; android:label=&quot;@string/app_name&quot;&gt;
        &lt;activity android:name=&quot;EjemploInvertir&quot;&gt;
            &lt;intent-filter&gt;
                &lt;action android:name=&quot;android.intent.action.MAIN&quot; /&gt;
                &lt;category android:name=&quot;android.intent.category.LAUNCHER&quot;&gt;&lt;/category&gt;
            &lt;/intent-filter&gt;
        &lt;/activity&gt;
    &lt;/application&gt;
    &lt;uses-sdk android:minSdkVersion=&quot;4&quot; /&gt;
&lt;/manifest&gt;</pre>
<p style="text-align: justify;">Ahora que hemos configurado el <code>AndroidManifest.xml</code> podemos hacer una prueba de ejecución del programa&#8230; si todo va bien veremos algo como esto:</p>
<p style="text-align: center;"><img class="size-full wp-image-3728 aligncenter" title="hello-world-android" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/hello-world-android.png" alt="" width="600" height="389" /></p>
<p style="text-align: justify;">
<h3>2. Crear la interfaz gráfica</h3>
</p>
<p style="text-align: justify;">En este paso, crearemos una nueva interfaz gráfica que contendrá un label, una caja de texto y un botón. Aprenderemos a posicionar/agrupar los elementos en la pantalla, y darles un tamaño adecuado. Vamos a crear un nuevo layout dentro del directorio <code>res/layout/</code> (aunque podríamos haber usado el <code>main.xml</code> generado por asistente de Eclipse, pero prefiero que aprenda este proceso de una vez). Así que, hacemos clic en el botón de creación de nuevos archivos XML de Android:</p>
<p style="text-align: center;"><img class="size-full wp-image-3729 aligncenter" title="nuevo-xml-android" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/nuevo-xml-android.png" alt="" width="480" height="168" /></p>
<p style="text-align: justify;">Seleccionamos la opción layout y le damos un nombre al archivo. Por ejemplo, <code>interfaz_grafica.xml</code>:</p>
<p style="text-align: center;"><img class="size-full wp-image-3730 aligncenter" title="crear-xml-android" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/crear-xml-android.png" alt="" width="600" height="436" /></p>
<p style="text-align: justify;">¡Hacemos clic en <em>Finish</em> y listo! Al hacer doble clic sobre el archivo que acabamos de crear vemos que es posible editarlo usando una interfaz gráfica, pero en este caso usaremos el editor de XML, ya que es mucho más rápido hacerlo así <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Hacemos clic en la pestaña inferior que tiene el nombre del archivo (<code>interfaz_grafica.xml</code>) y veremos algo como esto:</p>
<pre class="brush: xml; title: ; notranslate">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
 android:layout_width=&quot;wrap_content&quot;
 android:layout_height=&quot;wrap_content&quot;&gt;
&lt;/LinearLayout&gt;
</pre>
<p style="text-align: justify;">Por defecto se crea un objeto <a href="http://developer.android.com/intl/de/reference/android/widget/LinearLayout.html" class="external"><code>LinearLayout</code></a> que contiene contiene tres parámetros: un XML Name Space (en este caso <code>http://schemas.android.com/apk/res/android</code>), el tamaño que ocupará a lo ancho y el que ocupará a lo largo. Para estos dos ultimos parámetros se está usando <code>wrap_content</code> indicando que se debe usar el menor espacio posible. Los objetos <code>LinearLayout</code> funcionan de manera similar a los <code>JPanel</code> de <a href="http://casdiablo.net">Java</a>, pudiendo &#8220;contener&#8221; widgets de Android (labels, botones, menus u otros LinearLayout, etc.).</p>
<p style="text-align: justify;">Lo siguiente será crear la interfaz gráfica para nuestro programa de ejemplo, pero antes vamos a aprender un poco sobre el directorio <code>res/values</code> <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  Por defecto veremos que hay un archivo llamado <code>strings.xml</code> que contiene pares nomber&lt;=&gt;valor. Este archivo es usado para almacenar todas las variables &#8220;estáticas&#8221; de la aplicación. Si bien su uso no es estrictamente obligatorio, si es recomendado y es bueno saber usarlo. Para nuestro ejemplo entonces, tenemos dos cadenas de texto que podrían ser estáticas: el texto que aparecerá en el label y el texto que aparecerá en el botón. Para la primera vamos a asignar el texto directamente en el XML de la interfaz gráfica, mientras que para el botón lo haremos usando el archivo <code>strings.xml</code>; lo hago de las dos maneras con el fin de que quede clara la diferencia entre ambos métodos.</p>
<p style="text-align: justify;">Abrimos el archivo <code>strings.xml</code>, que se encuentra en el directorio <code>res/values</code>, para añadir una nueva cadena de texto que será usada por el botón de la aplicación. Solo debemos añadir algo como esto: &lt;string name=&#8221;texto_boton&#8221;&gt;Invertir!&lt;/string&gt;, de tal manera que quede así:</p>
<pre class="brush: xml; highlight: [5]; title: ; notranslate">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;resources&gt;
    &lt;string name=&quot;hello&quot;&gt;Hello World!&lt;/string&gt;
    &lt;string name=&quot;app_name&quot;&gt;Ejemplo&lt;/string&gt;
    &lt;string name=&quot;texto_boton&quot;&gt;Invertir!&lt;/string&gt;
&lt;/resources&gt;</pre>
<p style="text-align: justify;">Ahora sí, vamos a modificar el archivo <code>interfaz_grafica.xml</code> de tal manera que quede así:</p>
<pre class="brush: xml; title: ; notranslate">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
     android:layout_width=&quot;fill_parent&quot; android:layout_height=&quot;fill_parent&quot;
     android:orientation=&quot;vertical&quot;&gt;
    &lt;LinearLayout android:orientation=&quot;horizontal&quot;
     android:layout_width=&quot;fill_parent&quot; android:layout_height=&quot;wrap_content&quot;&gt;
        &lt;TextView android:text=&quot;Palabra: &quot; android:layout_width=&quot;wrap_content&quot;
         android:layout_height=&quot;wrap_content&quot; /&gt;
        &lt;EditText android:id=&quot;@+id/cajaTexto&quot; android:layout_width=&quot;fill_parent&quot;
         android:layout_height=&quot;wrap_content&quot; /&gt;
    &lt;/LinearLayout&gt;
    &lt;Button android=&quot;@+id/btnInvertir&quot; android:layout_width=&quot;fill_parent&quot;
     android:layout_height=&quot;wrap_content&quot; android:text=&quot;@string/texto_boton&quot;/&gt;
&lt;/LinearLayout&gt;</pre>
<p>Veamos qué hemos hecho arriba:</p>
<ul style="text-align: justify;">
<li>En la línea 3 podemos ver que cambiamos el ancho y alto del <code>LinearLayout</code> principal de tal manera que utilice toda la pantalla (usando <code>fill_parent</code>).</li>
<li>Puesto que el <code>LinearLayout</code> contendrá otros objetos, debemos indicarle el sentido en el que los irá poniendo. En este caso se deben poner verticalmente (<code>android:orientation="vertical"</code>).</li>
<li>En las líneas 5 y 6 creamos un nuevo <code>LinearLayout</code> que contendrá el label y la caja de texto. Puesto que queremos que estos dos objetos aparezcan en una sola línea, ponemos el parámetro <code>android:orientation="horizontal"</code>. Además, le indicamos que ocupe toda la pantalla a lo ancho, pero que la altura sea la más pequeña posible.</li>
<li>En las líneas 7 y 8 creamos un nuevo <code>TextView</code> (un label) con el texto <em>&#8220;Palabra: &#8220;</em>; esto lo indicamos con la propiedad <code>android:text</code>. Además queremos que ocupe el menor espacio posible tanto en alto como en ancho (<code>wrap_content</code> para <code>layout_width</code> y <code>layout_height</code>).</li>
<li>En las líneas 9 y 10 creamos un <code>EditText</code> (una caja de texto), que es donde el usuario pondrá la palabra que desea invertir. Intentará ocupar el mayor ancho posible en la pantalla. Además, puesto que este es un objeto del cual necesitaremos datos, debemos asignarle un ID para que podamos acceder a él desde el programa en Java que crearemos en breve.</li>
<li>En la línea 11 cerramos el <code>LinearLayout</code> que contiene el label y la caja de texto.</li>
<li>En las líneas 12 y 13 creamos un objeto <code>Button</code>. Este objeto también tiene un ID puesto que debemos obtener una referencia del mismo desde el programa en Java. Además, a la propiedad <code>android:text</code> se está asignando <code>@string/texto_boton</code> que es la referencia a la variable que creamos en el <code>strings.xml</code></li>
</ul>
<p style="text-align: justify;">Ahora que hemos creado la interfaz gráfica, vamos a ejecutar la aplicación para ver si ha quedado bien. Pero antes, debemos indicarle a nuestra Actividad que el layout que debe ejecutar es <code>interfaz_grafica.xml</code>. Esto lo hacemos modificando la clase <code>EjemploInvertir.java</code> para que quede así:</p>
<pre class="brush: java; title: ; notranslate">package net.casidiablo.ejemplo;
import android.app.Activity;
import android.os.Bundle;
public class EjemploInvertir extends Activity{
    @Override
    public void onCreate(Bundle b){
        super.onCreate(b);
        setContentView(R.layout.interfaz_grafica);
    }
}</pre>
<p style="text-align: justify;">Si todo va bien, al ejecutar la aplicación veremos algo como esto:</p>
<p style="text-align: center;"><img class="size-full wp-image-3733 aligncenter" title="interfaz-grafica-android" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/interfaz-grafica-android.png" alt="" width="600" height="389" /></p>
<h3>3. Programación de objetos de la interfaz gráfica</h3>
<p style="text-align: justify;">Ahora que hemos construido la interfaz gráfica, debemos programar la parte de &#8220;invertir la cadena de texto&#8221;. Para ello necesitamos extraer el texto que se ponga en la caja de texto y manejar los eventos que genera el botón; en cualquier caso, necesitamos referencias a dichos objetos. Así que, de momento, vamos a hacer que nuestra clase <code>EjemploInvertir.java</code> luzca así:</p>
<pre class="brush: java; title: ; notranslate">package net.casidiablo.ejemplo;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
public class EjemploInvertir extends Activity{
    //declarar objetos
    private EditText texto;
    private Button boton;
    @Override
    public void onCreate(Bundle b){
        super.onCreate(b);
        setContentView(R.layout.interfaz_grafica);
        //iniciar los objetos
        texto = (EditText) findViewById(R.id.cajaTexto);
        boton = (Button) findViewById(R.id.btnInvertir);
    }
}</pre>
<p style="text-align: justify;">Veamos qué ha pasado allá arriba <img src='http://casidiablo.net/wordpress/wp-includes/images/smilies/icon_idea.gif' alt=':idea:' class='wp-smiley' /> </p>
<ul style="text-align: justify;">
<li>En las líneas 4 y 5 importamos las clases <code>Button</code> y <code>EditText</code> del paquete <code>android.widget</code>.</li>
<li>En las líneas 9 y 10 declaramos objetos de tipo <code>EditText</code> y <code>Button</code>, los cuales los usaremos para manipular los que hemos creado en la interfaz gráfica.</li>
<li>En la líneas 17 iniciamos el objeto <code>EditTexto</code> usando el método <code>findViewById</code>, a la cual le enviamos como parámetro el ID de la caja de texto (¿recuerdas? pusimos esto dentro del XML: <code>android:id="@+id/cajaTexto"</code>).</li>
<li>De igual manera creamos el objeto botón usando el ID <code>btnInvertir</code> que definimos en el XML.</li>
</ul>
<p style="text-align: justify;">Hasta el momento solo hemos creado los objetos, pero no estamos haciendo nada con ellos. Para esto, vamos a asignar un listener al botón, que ejecutará ciertas acciones al momento de presionarlo. Esto lo hacemos con el método <code>setOnClickListener</code> el cual recibe como parámetro un objeto de tipo <code>android.view.View.OnClickListener</code>. Veamos cómo debe quedar la clase y luego explico cada componente nuevo:</p>
<pre class="brush: java; title: ; notranslate">package net.casidiablo.ejemplo;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class EjemploInvertir extends Activity{
	//declarar objetos
	private EditText cajaDeTexto;
	private Button boton;
	@Override
	public void onCreate(Bundle b){
		super.onCreate(b);
		setContentView(R.layout.interfaz_grafica);
		//iniciar los objetos
		cajaDeTexto = (EditText) findViewById(R.id.cajaTexto);
		boton = (Button) findViewById(R.id.btnInvertir);
		boton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				invertir();
			}
		});
	}
	//metodo para invertir el texto
	private void invertir(){
		//obtener el string de la caja de texto
		String txt = cajaDeTexto.getText().toString();
		//verificar que haya texto por invertir
		if(!txt.equals(&quot;&quot;)){
			//invertir texto
			String resultado = &quot;&quot;;
			for (int i = txt.length()-1; i&gt;=0; i--)
				resultado += txt.charAt (i);
		    //asignamos el string invertido a la caja de texto
			cajaDeTexto.setText(resultado);
		}
		else Toast.makeText(this, &quot;No hay nada que invertir&quot;, Toast.LENGTH_LONG).show();
	}
}</pre>
<p>Veamos que fue todo eso&#8230;</p>
<ul style="text-align: justify;">
<li>En la línea 5 se importan la interfaz <code>OnClickListener</code>. Dicha interfaz es usada en la línea 20 al crear un objeto que se enviará como parámetro al método <code>setOnClickListener</code>. Dentro, es necesario implementar el método <code>onClick</code> en donde pondremos las instrucciones que serán ejecutadas al momento de hacer clic en el botón (en este caso una llamada a la función <code>invertir()</code>, líneas 28 a 41).</li>
<li>El método invertir inicia una variable <code>String</code> con los datos que contenga la caja de texto, usando el método <code>getText</code> de la clase <code>EditText</code>.</li>
<li>En las líneas 35 y 36 se invierte la cadena, que posteriormente se pone de nuevo en la caja de texto usando el método <code>setText</code> (línea 38).</li>
<li>En la línea 40 mostramos un mensaje usando la clase <code>Toast</code>. Este mensaje aparece cuando no hay datos en la caja de texto. Lo he colocado puesto que es bastante sencillo de implementar. Basta con usar el método estático <code>makeText</code> pasándole como parámetros el contexto en el que se mostrará (se usa <code>this</code>, puesto que se mostrará en la Actividad actual), el texto a mostrar y cuanto tiempo durará el mensaje.</li>
</ul>
<p style="text-align: justify;">Al ejecutar la aplicación, escribir &#8220;<em>Estoy invertido</em>&#8221; en la caja de texto y presionar el botón, veremos algo así:</p>
<p style="text-align: center;"><img class="size-full wp-image-3734 aligncenter" title="texto-android" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/texto-android.png" alt="" width="600" height="389" /></p>
<p style="text-align: justify;">Si no ponemos texto y presionamos el botón <em>Invertir</em>, veremos:</p>
<p style="text-align: center;"><img class="size-full wp-image-3735 aligncenter" title="sin-texto-android" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/sin-texto-android.png" alt="" width="600" height="389" /></p>
<p style="text-align: justify;">La aplicación está lista para ser probada en un dispositivo real. En mi caso la instalé en una HTC Tattoo y se ve así:</p>
<p style="text-align: center;"><img class="size-full wp-image-3737 aligncenter" title="device" src="http://casidiablo.net/wordpress/wp-content/uploads/2010/03/device.png" alt="" width="240" height="320" /></p>
<p style="text-align: justify;">
<h3>4. Descargar código</h3>
</p>
<p style="text-align: justify;">Este es el código fuente usado para este tutorial, espero le haya gustado. Cualquier duda o sugerencia no dude en comentarla.</p>
<p><a class="tooltip descargacodigo" title="Descargar archivo ZIP con el código fuente" href="http://casidiablo.net/descargar/Ejemplo+UI+Android">Descargar Proyecto Eclipse</a></p>

]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/introduccion-ui-android/feed/</wfw:commentRss>
		<slash:comments>69</slash:comments>
		</item>
	</channel>
</rss>

