<?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>sgoliver.net blog</title>
	<atom:link href="http://www.sgoliver.net/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.sgoliver.net/blog</link>
	<description>Pensamientos varios sobre programación, lenguajes, .NET y Java</description>
	<lastBuildDate>Tue, 07 Sep 2010 11:09:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Interfaz de usuario en Android: Controles de selección (II)</title>
		<link>http://www.sgoliver.net/blog/?p=1414&amp;utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=interfaz-de-usuario-en-android-controles-de-seleccion-ii</link>
		<comments>http://www.sgoliver.net/blog/?p=1414#comments</comments>
		<pubDate>Tue, 07 Sep 2010 11:02:34 +0000</pubDate>
		<dc:creator>sgoliver</dc:creator>
				<category><![CDATA[Móviles]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[controles]]></category>
		<category><![CDATA[listas]]></category>
		<category><![CDATA[ListView]]></category>
		<category><![CDATA[personalización]]></category>
		<category><![CDATA[selección]]></category>

		<guid isPermaLink="false">http://www.sgoliver.net/blog/?p=1414</guid>
		<description><![CDATA[En el artículo anterior ya comenzamos a hablar de los controles de selección en Android, empezando por explicar el concepto de adaptador y describiendo el control Spinner. En este nuevo artículo nos vamos a centrar en el control de selección más utilizado de todos, el ListView. Un control ListView muestra al usuario una lista de [...]]]></description>
			<content:encoded><![CDATA[<p>En el <a title="Controles de selección en Android I" href="http://www.sgoliver.net/blog/?p=1404" target="_self">artículo anterior</a> ya comenzamos a hablar de los controles de selección en Android, empezando por explicar el concepto de <em>adaptador </em>y describiendo el control <span style="font-family: courier new,courier;">Spinner</span>. En este nuevo artículo nos vamos a centrar en el control de selección más utilizado de todos, el <span style="font-family: courier new,courier;">ListView</span>.</p>
<p>Un control <span style="font-family: courier new,courier;">ListView </span>muestra al usuario una lista de opciones seleccionables directamente sobre el propio control, sin listas emergentes como en el caso del control <span style="font-family: courier new,courier;">Spinner</span>. En caso de existir más opciones de las que se pueden mostrar sobre el control se podrá por supuesto hacer <span style="font-family: courier new,courier;">scroll </span>sobre la lista para acceder al resto de elementos.</p>
<p>Para empezar, veamos como podemos añadir un control ListView a nuestra interfaz de usuario:</p>
<pre class="syntax-highlight:xml">
&lt;ListView android:id=&quot;@+id/LstOpciones&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot; /&gt;
</pre>
<p>Una vez más, podremos modificar el aspecto del control utilizando las propiedades de fuente y color ya comentadas en artículos anteriores. Por su parte, para enlazar los datos con el control podemos utlizar por ejemplo el mismo código que <a title="Android Control Spinner" href="http://www.sgoliver.net/blog/?p=1404" target="_self">ya vimos</a> para el control <span style="font-family: courier new,courier;">Spinner</span>. Definiremos primero un array con nuestros datos de prueba, crearemos posteriormente el adaptador de tipo <span style="font-family: courier new,courier;">ArrayAdapter </span>y lo asignaremos finalmente al control mediante el método <span style="font-family: courier new,courier;">setAdapter()</span>:</p>
<pre class="syntax-highlight:java">
final String[] datos =
    new String[]{&quot;Elem1&quot;,&quot;Elem2&quot;,&quot;Elem3&quot;,&quot;Elem4&quot;,&quot;Elem5&quot;};

ArrayAdapter&lt;String&gt; adaptador =
    new ArrayAdapter&lt;String&gt;(this,
        android.R.layout.simple_list_item_1, datos);

ListView lstOpciones = (ListView)findViewById(R.id.LstOpciones);

lstOpciones.setAdapter(adaptador);
</pre>
<p>En este caso, para mostrar los datos de cada elemento hemos utilizado otro layout genérico de Android para los controles de tipo <span style="font-family: courier new,courier;">ListView </span>(<span style="font-family: courier new,courier;">android.R.layout.simple_list_item_1</span>), formado únicamente por un <span style="font-family: courier new,courier;">TextView </span>con unas dimensiones determinadas. La lista creada quedaría como se muestra en la imagen siguiente:</p>
<p><a href="http://www.sgoliver.net/blog/wp-content/uploads/2010/09/listview1.png"><img class="alignnone size-medium wp-image-1417" title="Controles Android ListView Básico" src="http://www.sgoliver.net/blog/wp-content/uploads/2010/09/listview1-200x300.png" alt="Controles Android ListView Básico" width="200" height="300" /></a></p>
<p>Como podéis comprobar el uso básico del control <span style="font-family: courier new,courier;">ListView </span>es completamente análogo al ya comentado para el control <span style="font-family: courier new,courier;">Spinner</span>. Pero, ¿y si necesitamos mostrar datos más complejos en la lista? ¿qué ocurre si necesitamos que cada elemento de la lista esté formado a su vez por varios elementos? Pues vamos a provechar este artículo dedicado a los <span style="font-family: courier new,courier;">ListView </span>para ver cómo podríamos conseguirlo, aunque todo lo que comentaré es extensible a otros controles de selección.</p>
<p>Para no complicar mucho el tema vamos a hacer que cada elemento de la lista muestre por ejemplo dos líneas de texto a modo de título y subtítulo con formatos diferentes (por supuesto se podrían añadir muchos más elementos, por ejemplo imágenes, <em>checkboxes</em>, etc).</p>
<p>En primer lugar vamos a crear una nueva clase java para contener nuestros datos de prueba. Vamos a llamarla <span style="font-family: courier new,courier;">Titular </span>y tan sólo va a contener dos atributos, título y subtítulo.</p>
<pre class="syntax-highlight:java">
package net.sgoliver;

public class Titular
{
	private String titulo;
	private String subtitulo;

	public Titular(String tit, String sub){
		titulo = tit;
		subtitulo = sub;
	}

	public String getTitulo(){
		return titulo;
	}

	public String getSubtitulo(){
		return subtitulo;
	}
}
</pre>
<p>En cada elemento de la lista queremos mostrar ambos datos, por lo que el siguiente paso será crear un layout XML con la estructura que deseemos. En mi caso voy a mostrarlos en dos etiquetas de texto (<span style="font-family: courier new,courier;">TextView</span>), la primera de ellas en negrita y con un tamaño de letra un poco mayor. Llamaremos a este layout &#8220;<em>listitem_titular.xml</em>&#8220;:</p>
<pre class="syntax-highlight:xml">
&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;
  android:orientation=&quot;vertical&quot;&gt;

&lt;TextView android:id=&quot;@+id/LblTitulo&quot;
	android:layout_width=&quot;fill_parent&quot;
	android:layout_height=&quot;wrap_content&quot;
	android:textStyle=&quot;bold&quot;
	android:textSize=&quot;20px&quot; /&gt;

&lt;TextView android:id=&quot;@+id/LblSubTitulo&quot;
	android:layout_width=&quot;fill_parent&quot;
	android:layout_height=&quot;wrap_content&quot;
	android:textStyle=&quot;normal&quot;
	android:textSize=&quot;12px&quot; /&gt;

&lt;/LinearLayout&gt;
</pre>
<p>Ahora que ya tenemos creados tanto el soporte para nuestros datos como el layout que necesitamos para visualizarlos, lo siguiente que debemos hacer será indicarle al adaptador cómo debe utilizar ambas cosas para generar nuestra interfaz de usuario final. Para ello vamos a crear nuestro propio adaptador extendiendo de la clase <span style="font-family: courier new,courier;">ArrayAdapter</span>.</p>
<pre class="syntax-highlight:java">
class AdaptadorTitulares extends ArrayAdapter {

	Activity context;

    	AdaptadorTitulares(Activity context) {
    		super(context, R.layout.listitem_titular, datos);
    		this.context = context;
    	}

    	public View getView(int position, View convertView, ViewGroup parent) {
		LayoutInflater inflater = context.getLayoutInflater();
		View item = inflater.inflate(R.layout.listitem_titular, null);

		TextView lblTitulo = (TextView)item.findViewById(R.id.LblTitulo);
		lblTitulo.setText(datos[position].getTitulo());

		TextView lblSubtitulo = (TextView)item.findViewById(R.id.LblSubTitulo);
		lblSubtitulo.setText(datos[position].getSubtitulo());

		return(item);
	}
}
</pre>
<p>Analicemos el código anterior. Lo primero que encontramos es el constructor para nuestro adaptador, al que sólo pasaremos el contexto (que será la actividad desde la que se crea el adaptador). En este constructor tan sólo guardaremos el contexto para nuestro uso posterior y llamaremos al constructor padre tal como ya vimos al principio de este artículo, pasándole el ID del layout que queremos utilizar (en nuestro caso el nuevo que hemos creado, &#8220;listitem_titular&#8221;) y el array que contiene los datos a mostrar.</p>
<p>Posteriormente, redefinimos el método encargado de generar y rellenar con nuestros datos todos los controles necesarios de la interfaz gráfica de cada elemento de la lista. Este método es <span style="font-family: courier new,courier;">getView()</span>.</p>
<p>El método getView() se llamará cada vez que haya que mostrar un elemento de la lista. Lo primero que debe hacer es &#8220;<em>inflar</em>&#8221; el layout XML que hemos creado. Esto consiste en consultar el XML de nuestro layout y crear e inicializar la estructura de objetos java equivalente. Para ello, crearemos un nuevo objeto <span style="font-family: courier new,courier;">LayoutInflater </span>y generaremos la estructura de objetos mediante su método <span style="font-family: courier new,courier;">inflate(<em>id_layout</em>)</span>.</p>
<p>Tras esto, tan sólo tendremos que obtener la referencia a cada una de nuestras etiquetas como siempre lo hemos hecho y asignar su texto correspondiente según los datos de nuestro array y la posición del elemento actual (parámetro <span style="font-family: courier new,courier;">position</span> del método <span style="font-family: courier new,courier;">getView()</span>).</p>
<p>Una vez tenemos definido el comportamiento de nuestro adaptador la forma de proceder en la actividad principal será análoga a lo ya comentado, definiremos el array de datos de prueba, crearemos el adaptador y lo asignaremos al control mediante <span style="font-family: courier new,courier;">setAdapter()</span>:</p>
<pre class="syntax-highlight:java">
private Titular[] datos =
    new Titular[]{
    	new Titular(&quot;Título 1&quot;, &quot;Subtítulo largo 1&quot;),
    	new Titular(&quot;Título 2&quot;, &quot;Subtítulo largo 2&quot;),
    	new Titular(&quot;Título 3&quot;, &quot;Subtítulo largo 3&quot;),
    	new Titular(&quot;Título 4&quot;, &quot;Subtítulo largo 4&quot;),
    	new Titular(&quot;Título 5&quot;, &quot;Subtítulo largo 5&quot;)};

//...
//...

AdaptadorTitulares adaptador =
        new AdaptadorTitulares(this);

ListView lstOpciones = (ListView)findViewById(R.id.LstOpciones);

lstOpciones.setAdapter(adaptador);
</pre>
<p>Hecho esto, y si todo ha ido bien, nuestra nueva lista debería quedar como vemos en la imagen siguiente:</p>
<p><a href="http://www.sgoliver.net/blog/wp-content/uploads/2010/09/listview2.png"><img class="alignnone size-medium wp-image-1420" title="Android Control ListView Personalizado" src="http://www.sgoliver.net/blog/wp-content/uploads/2010/09/listview2-200x300.png" alt="Android Control ListView Personalizado" width="200" height="300" /></a></p>
<p>Podéis descargar el código de este artículo desde <a href="http://www.sgoliver.net/blog/wp-content/uploads/2010/09/android-listview.zip">este enlace</a>.</p>
<p>Aunque ya sabemos utilizar y personalizar las listas en Android, en el próximo artículo daremos algunas indicaciones para utilizar de una forma mucho más eficiente los controles de este tipo, algo que los usuarios de nuestra aplicación agradecerán enormemente al mejorarse la respuesta de la aplicación y reducirse el consumo de batería.</p>
<h3  class="related_post_title">Entradas relacionadas</h3><ul class="related_post"><li><a href="http://www.sgoliver.net/blog/?p=1404" title="Interfaz de usuario en Android: Controles de selección (I)">Interfaz de usuario en Android: Controles de selección (I)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1387" title="Interfaz de usuario en Android: Controles básicos (III)">Interfaz de usuario en Android: Controles básicos (III)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1373" title="Interfaz de usuario en Android: Controles básicos (II)">Interfaz de usuario en Android: Controles básicos (II)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1363" title="Interfaz de usuario en Android: Controles básicos (I)">Interfaz de usuario en Android: Controles básicos (I)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1341" title="Interfaz de usuario en Android: Layouts">Interfaz de usuario en Android: Layouts</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.sgoliver.net/blog/?feed=rss2&amp;p=1414</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Interfaz de usuario en Android: Controles de selección (I)</title>
		<link>http://www.sgoliver.net/blog/?p=1404&amp;utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=interfaz-de-usuario-en-android-controles-de-seleccion-i</link>
		<comments>http://www.sgoliver.net/blog/?p=1404#comments</comments>
		<pubDate>Mon, 06 Sep 2010 23:43:17 +0000</pubDate>
		<dc:creator>sgoliver</dc:creator>
				<category><![CDATA[Móviles]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[adaptadores]]></category>
		<category><![CDATA[adapter]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[controles]]></category>
		<category><![CDATA[desplegable]]></category>
		<category><![CDATA[lista]]></category>
		<category><![CDATA[selección]]></category>
		<category><![CDATA[Spinner]]></category>

		<guid isPermaLink="false">http://www.sgoliver.net/blog/?p=1404</guid>
		<description><![CDATA[Una vez repasados los controles básicos (I, II, III) que podemos utilizar en nuestras aplicaciones Android, vamos a dedicar los próximos artículos a describir los diferentes controles de selección disponibles en la plataforma. Al igual que en otros frameworks Android dispone de diversos controles que nos permiten seleccionar una opción dentro de una lista de [...]]]></description>
			<content:encoded><![CDATA[<p>Una vez repasados los controles básicos (<a title="Controles básicos Android I" href="http://www.sgoliver.net/blog/?p=1363" target="_self">I</a>, <a title="Controles básicos Android II" href="http://www.sgoliver.net/blog/?p=1373" target="_self">II</a>, <a title="Controles básicos Android III" href="http://www.sgoliver.net/blog/?p=1387" target="_self">III</a>) que podemos utilizar en nuestras aplicaciones Android, vamos a dedicar los próximos artículos a describir los diferentes controles de selección disponibles en la plataforma. Al igual que en otros <em>frameworks </em>Android dispone de diversos controles que nos permiten seleccionar una opción dentro de una lista de posibilidades. Así, podremos utilizar listas desplegables (<span style="font-family: courier new,courier;">Spinner</span>), listas fijas (<span style="font-family: courier new,courier;">ListView</span>), tablas (<span style="font-family: courier new,courier;">GridView</span>) y otros controles específicos de la plataforma como por ejemplo las galerías de imágenes (<span style="font-family: courier new,courier;">Gallery</span>).</p>
<p>En este primer artículo dedicado a los controles de selección vamos a describir un elemento importante y común a todos ellos, los <em>adaptadores</em>, y lo vamos a aplicar al primer control de los indicados, las listas desplegables.</p>
<p><span style="text-decoration: underline;"><strong>Adaptadores en Android (<em>adapters</em>)</strong></span></p>
<p>Para los desarrolladores de java que hayan utilizado frameworks de interfaz gráfica como <em>Swing</em>, el concepto de <em>adaptador</em> les resultará familiar. Un adaptador representa algo así como una interfaz común al modelo de datos que existe por detrás de todos los controles de selección que hemos comentado. Dicho de otra forma, todos los controles de selección accederán a los datos que contienen a través de un adaptador.</p>
<p>Además de proveer de datos a los controles visuales, el adaptador también será responsable de generar a partir de estos datos las vistas específicas que se mostrarán dentro del control de selección. Por ejemplo, si cada elemento de una lista estuviera formado a su vez por una imagen y varias etiquetas, el responsable de generar y establecer el contenido de todos estos &#8220;<em>sub-elementos</em>&#8221; a partir de los datos será el propio adaptador.</p>
<p>Android proporciona de serie varios tipos de adaptadores sencillos, aunque podemos extender su funcionalidad facilmente para adaptarlos a nuestras necesidades. Los más comunes son los siguientes:</p>
<ul>
<li><span style="font-family: courier new,courier;">ArrayAdapter</span>. Es el más sencillo de todos los adaptadores, y provee de datos a un control de selección a partir de un array de objetos de cualquier tipo.</li>
<li><span style="font-family: courier new,courier;">SimpleAdapter</span>. Se utiliza para mapear datos sobre los diferentes controles definidos en un fichero XML de layout.</li>
<li><span style="font-family: courier new,courier;">SimpleCursorAdapter</span>. Se utiliza para mapear las columnas de un cursor sobre los diferentes elementos visuales contenidos en el control de selección.</li>
</ul>
<p>Para no complicar excesivamente los tutoriales, por ahora nos vamos a conformar con describir la forma de utilizar un <span style="font-family: courier new,courier;">ArrayAdapter </span>con los diferentes controles de selección disponibles. Más adelante aprenderemos a utilizar el resto de adaptadores en contextos más específicos.</p>
<p>Veamos cómo crear un adaptador de tipo ArrayAdapter para trabajar con un array genérico de java:</p>
<pre class="syntax-highlight:java">
final String[] datos =
        new String[]{&quot;Elem1&quot;,&quot;Elem2&quot;,&quot;Elem3&quot;,&quot;Elem4&quot;,&quot;Elem5&quot;};

ArrayAdapter&lt;String&gt; adaptador =
       	new ArrayAdapter&lt;String&gt;(this,
        	android.R.layout.simple_spinner_item, datos);
</pre>
<p>Comentemos un poco el código. Sobre la primera línea no hay nada que decir, es tan sólo la definición del array java que contendrá los datos a mostrar en el control, en este caso un array sencillo con cinco cadenas de caracteres. En la segunda línea creamos el adaptador en sí, al que pasamos 3 parámetros:</p>
<ol>
<li>El <em>contexto</em>, que normalmente será simplemente una referencia a la actividad donde se crea el adaptador.</li>
<li>El ID del <em>layout </em>sobre el que se mostrarán los datos del control. En este caso le pasamos el ID de un layout predefinido en Android (<span style="font-family: courier new,courier;">android.R.layout.simple_spinner_item</span>), formado únicamente por un control <span style="font-family: courier new,courier;">TextView</span>, pero podríamos pasarle el ID de cualquier layout de nuestro proyecto con cualquier estructura y conjunto de controles, más adelante veremos cómo.</li>
<li>El <em>array </em>que contiene los datos a mostrar.</li>
</ol>
<p>Con esto ya tendríamos creado nuestro adaptador para los datos a mostrar y ya tan sólo nos quedaría asignar este adaptador a nuestro control de selección para que éste mostrase los datos en la aplicación.</p>
<p><strong><span style="text-decoration: underline;">Control Spinner</span> [<a title="Androis SDK - Control Spinner" href="http://developer.android.com/reference/android/widget/Spinner.html" target="_blank">API</a>]</strong></p>
<p>Las listas desplegables en Android se llaman <span style="font-family: courier new,courier;">Spinner</span>. Funcionan de forma similar al de cualquier control de este tipo, el usuario selecciona la lista, se muestra una especie de lista emergente al usuario con todas las opciones disponibles y al seleccionarse una de ellas ésta queda fijada en el control. Para añadir una lista de este tipo a nuestra aplicación podemos utilizar el código siguiente:</p>
<pre class="syntax-highlight:xml">
&lt;Spinner android:id=&quot;@+id/CmbOpciones&quot;
	android:layout_width=&quot;fill_parent&quot;
	android:layout_height=&quot;wrap_content&quot; /&gt;
</pre>
<p>Poco vamos a comentar de aquí ya que lo que nos interesan realmente son los datos a mostrar. En cualquier caso, las opciones para personalizar el aspecto visual del control (fondo, color y tamaño de fuente, &#8230;) son las mismas ya comentadas para los controles básicos.</p>
<p>Para enlazar nuestro adaptador (y por tanto nuestros datos) a este control utilizaremos el siguiente código java:</p>
<pre class="syntax-highlight:java">
final Spinner cmbOpciones = (Spinner)findViewById(R.id.CmbOpciones);

adaptador.setDropDownViewResource(
        android.R.layout.simple_spinner_dropdown_item);

cmbOpciones.setAdapter(adaptador);
</pre>
<p>Comenzamos como siempre por obtener una referencia al control a través de su ID. Y en la última línea asignamos el adaptador al control mediante el método <span style="font-family: courier new,courier;">setAdapter()</span>. ¿Y la segunda línea para qué es? Cuando indicamos en el apartado anterior cómo construir un adaptador vimos cómo uno de los parámetros que le pasábamos era el ID del layout que utilizaríamos para visualizar los elementos del control. Sin embargo, en el caso del control <span style="font-family: courier new,courier;">Spinner</span>, este layout tan sólo se aplicará al elemento seleccionado en la lista, es decir, al que se muestra directamente sobre el propio control cuando no está desplegado. Sin embargo, antes indicamos que el funcionamiento normal del control <span style="font-family: courier new,courier;">Spinner </span>incluye entre otras cosas mostrar una lista emergente con todas las opciones disponibles. Pues bien, para personalizar también el aspecto de cada elemento en dicha lista emergente tenemos el método <span style="font-family: courier new,courier;">setDropDownViewResource(<em>ID_layout</em>)</span>, al que podemos pasar otro ID de layout distinto al primero sobre el que se mostrarán los elementos de la lista emergente. En este caso hemos utilizado otro layout predefinido an Android para las listas desplegables (<span style="font-family: courier new,courier;">android.R.layout.simple_spinner_dropdown_item</span>).</p>
<p>Con estas simples lineas de código conseguiremos mostrar un control como el que vemos en las siguientes imágenes:</p>
<p><a href="http://www.sgoliver.net/blog/wp-content/uploads/2010/09/spinner1.png"><img class="size-medium wp-image-1410 alignleft" title="Android Control Spinner (sin desplegar)" src="http://www.sgoliver.net/blog/wp-content/uploads/2010/09/spinner1-200x300.png" alt="Android Control Spinner (sin desplegar)" width="200" height="300" /></a> <a href="http://www.sgoliver.net/blog/wp-content/uploads/2010/09/spinner2.png"><img class="alignnone size-medium wp-image-1411" title="Android Control Spinner (desplegado)" src="http://www.sgoliver.net/blog/wp-content/uploads/2010/09/spinner2-200x300.png" alt="Android Control Spinner (desplegado)" width="200" height="300" /></a></p>
<p>Como se puede observar en las imágenes, la representación del elemento seleccionado (primera imagen) y el de las opciones disponibles (segunda imagen) es distinto, incluyendo el segundo de ellos incluso algún elemento gráfico a la derecha para mostrar el estado de cada opción. Como hemos comentado, esto es debido a la utilización de dos layouts diferentes para uno y otros elementos.</p>
<p>En cuanto a los eventos lanzados por el control <span style="font-family: courier new,courier;">Spinner</span>, el más comunmente utilizado será el generado al seleccionarse una opción de la lista desplegable, <span style="font-family: courier new,courier;">onItemSelected</span>. Para capturar este evento se procederá de forma similar a lo ya visto para otros controles anteriormente, asignadole su controlador mediante el método <span style="font-family: courier new,courier;">setOnItemSelectedListener()</span>:</p>
<pre class="syntax-highlight:java">
cmbOpciones.setOnItemSelectedListener(
    	new AdapterView.OnItemSelectedListener() {
		public void onItemSelected(AdapterView&lt;?&gt; parent,
			android.view.View v, int position, long id) {
   				lblMensaje.setText(&quot;Seleccionado: &quot; + datos[position]);
		}

		public void onNothingSelected(AdapterView&lt;?&gt; parent) {
			lblMensaje.setText(&quot;&quot;);
		}
});
</pre>
<p>Para este evento definimos dos métodos, el primero de ellos (<span style="font-family: courier new,courier;">onItemSelected</span>) que será llamado cada vez que se selecciones una opción en la lista desplegable, y el segundo (<span style="font-family: courier new,courier;">onNothingSelected</span>) que se llamará cuando no haya ninguna opción seleccionada (esto puede ocurrir por ejemplo si el adaptador no tiene datos).</p>
<p>En el siguiente artículo describiremos el uso de controles de tipo lista (<span style="font-family: courier new,courier;">ListView</span>).</p>
<h3  class="related_post_title">Entradas relacionadas</h3><ul class="related_post"><li><a href="http://www.sgoliver.net/blog/?p=1414" title="Interfaz de usuario en Android: Controles de selección (II)">Interfaz de usuario en Android: Controles de selección (II)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1387" title="Interfaz de usuario en Android: Controles básicos (III)">Interfaz de usuario en Android: Controles básicos (III)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1373" title="Interfaz de usuario en Android: Controles básicos (II)">Interfaz de usuario en Android: Controles básicos (II)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1363" title="Interfaz de usuario en Android: Controles básicos (I)">Interfaz de usuario en Android: Controles básicos (I)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1341" title="Interfaz de usuario en Android: Layouts">Interfaz de usuario en Android: Layouts</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.sgoliver.net/blog/?feed=rss2&amp;p=1404</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Interfaz de usuario en Android: Controles básicos (III)</title>
		<link>http://www.sgoliver.net/blog/?p=1387&amp;utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=interfaz-de-usuario-en-android-controles-basicos-iii</link>
		<comments>http://www.sgoliver.net/blog/?p=1387#comments</comments>
		<pubDate>Fri, 27 Aug 2010 08:49:02 +0000</pubDate>
		<dc:creator>sgoliver</dc:creator>
				<category><![CDATA[Móviles]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[básicos]]></category>
		<category><![CDATA[CheckBox]]></category>
		<category><![CDATA[controles]]></category>
		<category><![CDATA[RadioButton]]></category>
		<category><![CDATA[RadioGroup]]></category>

		<guid isPermaLink="false">http://www.sgoliver.net/blog/?p=1387</guid>
		<description><![CDATA[Tras hablar de varios de los controles indispensables en cualquier aplicación Android, como son los botones y los cuadros de texto, en este artículo vamos a ver cómo utilizar otros dos tipos de controles básicos en muchas aplicaciones, los checkboxes y los radio buttons. Control CheckBox [API] Un control checkbox se suele utilizar para marcar [...]]]></description>
			<content:encoded><![CDATA[<p>Tras hablar de varios de los controles indispensables en cualquier aplicación Android, como son los <a title="Botones en Android" href="http://www.sgoliver.net/blog/?p=1363" target="_blank">botones</a> y los <a title="Cuadros de texto en Android" href="http://www.sgoliver.net/blog/?p=1373" target="_blank">cuadros de texto</a>, en este artículo vamos a ver cómo utilizar otros dos tipos de controles básicos en muchas aplicaciones, los <em>checkboxes </em>y los <em>radio buttons</em>.</p>
<p><strong><span style="text-decoration: underline;">Control CheckBox</span> [<a title="Android SDK - CheckBox" href="http://developer.android.com/reference/android/widget/CheckBox.html" target="_blank">API</a>]</strong></p>
<p>Un control <em>checkbox </em>se suele utilizar para marcar o desmarcar opciones en una aplicación, y en Android está representado por la clase del mismo nombre, CheckBox. La forma de definirlo en nuestra interfaz y los métodos disponibles para manipularlos desde nuestro código son análogos a los ya comentados para el control <span style="font-family: courier new,courier;">ToggleButton</span>.</p>
<p>De esta forma, para definir un control de este tipo en nuestro <em>layout </em>podemos utilizar el código siguiente, que define un <em>checkbox </em>con el texto &#8220;Márcame&#8221;:</p>
<pre class="syntax-highlight:xml">
&lt;CheckBox android:id=&quot;@+id/ChkMarcame&quot;
	android:layout_width=&quot;wrap_content&quot;
	android:layout_height=&quot;wrap_content&quot;
	android:text=&quot;Márcame!&quot; /&gt;
</pre>
<p>En cuanto a la personalización del control podemos decir que éste extiende [indirectamente] del control TextView, por lo que todas las opciones de formato ya comentadas en artículos anteriores son válidas también para este control.</p>
<p>En el código de la aplicación podremos hacer uso de los métodos <span style="font-family: courier new,courier;">isChecked()</span> para conocer el estado del control, y <span style="font-family: courier new,courier;">setChecked(<em>estado</em>)</span> para establecer un estado concreto para el control.</p>
<pre class="syntax-highlight:java">
if (checkBox.isChecked()) {
    checkBox.setChecked(false);
}
</pre>
<p>En cuanto a los posibles eventos que puede lanzar este control, el más interesante es sin duda el que informa de que ha cambiado el estado del control, que recibe el nombre de <span style="font-family: courier new,courier;">onCheckedChanged</span>. Para implementar las acciones de este evento podríamos utilizar por tanto la siguiente lógica:</p>
<pre class="syntax-highlight:java">
final CheckBox cb = (CheckBox)findViewById(R.id.chkMarcame);

cb.setOnCheckedChangeListener(
    new CheckBox.OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView,
                                                  boolean isChecked) {
            if (isChecked) {
                cb.setText(&quot;Checkbox marcado!&quot;);
            }
            else {
                cb.setText(&quot;Checkbox desmarcado!&quot;);
        }
    }
});
</pre>
<p><strong><span style="text-decoration: underline;">Control RadioButton</span> [<a title="Android SDK - RadioButton" href="http://developer.android.com/reference/android/widget/RadioButton.html" target="_blank">API</a>]</strong></p>
<p>Al igual que los controles <em>checkbox</em>, un <em>radiobutton </em>puede estar marcado o desmarcado, pero en este caso suelen utilizarse dentro de un grupo de opciones donde una, y sólo una, de ellas debe estar marcada obligatoriamente, es decir, que si se marca una de ellas se desmarcará automáticamente la que estuviera activa anteriormente. En Android, un grupo de botones <em>radiobutton </em>se define mediante un elemento <span style="font-family: courier new,courier;">RadioGroup</span>, que a su vez contendrá todos los elementos <span style="font-family: courier new,courier;">RadioButton </span>necesarios. Veamos un ejemplo de cómo definir un grupo de dos controles <em>radiobutton </em>en nuestra interfaz:</p>
<pre class="syntax-highlight:xml">
&lt;RadioGroup android:id=&quot;@+id/gruporb&quot;
	android:orientation=&quot;vertical&quot;
	android:layout_width=&quot;fill_parent&quot;
	android:layout_height=&quot;fill_parent&quot; &gt;

	&lt;RadioButton android:id=&quot;@+id/radio1&quot;
		android:layout_width=&quot;wrap_content&quot;
		android:layout_height=&quot;wrap_content&quot;
		android:text=&quot;Opción 1&quot; /&gt;

	&lt;RadioButton android:id=&quot;@+id/radio2&quot;
		android:layout_width=&quot;wrap_content&quot;
		android:layout_height=&quot;wrap_content&quot;
		android:text=&quot;Opción 2&quot; /&gt;

&lt;/RadioGroup&gt;
</pre>
<p>En primer lugar vemos cómo podemos definir el grupo de controles indicando su orientación (vertical u horizontal) al igual que ocurría por ejemplo con un <em>LinearLayout</em>. Tras esto, se añaden todos los objetos RadioButton necesarios indicando su ID mediante la propiedad <span style="font-family: courier new,courier;">android:id</span> y su texto mediante <span style="font-family: courier new,courier;">android:text</span>.</p>
<p>Una vez definida la interfaz podremos manipular el control desde nuestro código java haciendo uso de los diferentes métodos del control <span style="font-family: courier new,courier;">RadioGroup</span>, los más importantes: <span style="font-family: courier new,courier;">check(id)</span> para marcar una opción determinada mediante su ID, <span style="font-family: courier new,courier;">clearCheck()</span> para desmarcar todas las opciones, y <span style="font-family: courier new,courier;">getCheckedRadioButtonId()</span> que como su nombre indica devolverá el ID de la opción marcada (o el valor -1 si no hay ninguna marcada). Veamos un ejemplo:</p>
<pre class="syntax-highlight:java">
final RadioGroup rg = (RadioGroup)findViewById(R.id.gruporb);
rg.clearCheck();
rg.check(R.id.radio1);
int idSeleccionado = rg.getCheckedRadioButtonId();
</pre>
<p>En cuanto a los eventos lanzados, al igual que en el caso de los checkboxes, el más importante será el que informa de los cambios en el elemento seleccionado, llamado también en este caso <span style="font-family: courier new,courier;">onCheckedChange</span>. Vemos cómo tratar este evento del objeto <span style="font-family: courier new,courier;">RadioGroup</span>:</p>
<pre class="syntax-highlight:java">
final RadioGroup rg = (RadioGroup)findViewById(R.id.gruporb);

rg.setOnCheckedChangeListener(
    new RadioGroup.OnCheckedChangeListener() {
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            lblMensaje.setText(&quot;ID opcion seleccionada: &quot; + checkedid);
        }
});
</pre>
<p>Veamos finalmente una imagen del aspecto de estos dos nuevos tipos de controles básicos que hemos comentado en este artículo:</p>
<p><a href="http://www.sgoliver.net/blog/wp-content/uploads/2010/08/check-radio.png"><img class="alignnone size-medium wp-image-1397" title="Checkbox y RadioButton en Android" src="http://www.sgoliver.net/blog/wp-content/uploads/2010/08/check-radio-200x300.png" alt="Checkbox y RadioButton en Android" width="200" height="300" /></a></p>
<p>Podéis descargar el código de este artículo desde <a href="http://www.sgoliver.net/blog/wp-content/uploads/2010/08/android-radio-check.zip">este enlace</a>.</p>
<h3  class="related_post_title">Entradas relacionadas</h3><ul class="related_post"><li><a href="http://www.sgoliver.net/blog/?p=1373" title="Interfaz de usuario en Android: Controles básicos (II)">Interfaz de usuario en Android: Controles básicos (II)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1363" title="Interfaz de usuario en Android: Controles básicos (I)">Interfaz de usuario en Android: Controles básicos (I)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1414" title="Interfaz de usuario en Android: Controles de selección (II)">Interfaz de usuario en Android: Controles de selección (II)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1404" title="Interfaz de usuario en Android: Controles de selección (I)">Interfaz de usuario en Android: Controles de selección (I)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1341" title="Interfaz de usuario en Android: Layouts">Interfaz de usuario en Android: Layouts</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.sgoliver.net/blog/?feed=rss2&amp;p=1387</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Interfaz de usuario en Android: Controles básicos (II)</title>
		<link>http://www.sgoliver.net/blog/?p=1373&amp;utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=interfaz-de-usuario-en-android-controles-basicos-ii</link>
		<comments>http://www.sgoliver.net/blog/?p=1373#comments</comments>
		<pubDate>Thu, 26 Aug 2010 21:49:24 +0000</pubDate>
		<dc:creator>sgoliver</dc:creator>
				<category><![CDATA[Móviles]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[básicos]]></category>
		<category><![CDATA[controles]]></category>
		<category><![CDATA[cursiva]]></category>
		<category><![CDATA[Editable]]></category>
		<category><![CDATA[EditText]]></category>
		<category><![CDATA[formato]]></category>
		<category><![CDATA[ImageView]]></category>
		<category><![CDATA[negrita]]></category>
		<category><![CDATA[Span]]></category>
		<category><![CDATA[Spannable]]></category>
		<category><![CDATA[Spanned]]></category>
		<category><![CDATA[subrayado]]></category>
		<category><![CDATA[texto enriquecido]]></category>
		<category><![CDATA[TextView]]></category>

		<guid isPermaLink="false">http://www.sgoliver.net/blog/?p=1373</guid>
		<description><![CDATA[Después de haber hablado en el artículo anterior de los controles de tipo botón, en esta nueva entrega nos vamos a centrar en otros tres componentes básicos imprescindibles en nuestras aplicaciones: las imágenes (ImageView), las etiquetas (TextView) y por último los cuadros de texto (EditText). Control ImageView [API] El control ImageView permite mostrar imágenes en [...]]]></description>
			<content:encoded><![CDATA[<p>Después de haber hablado en el <a href="http://www.sgoliver.net/blog/?p=1363">artículo anterior</a> de los controles de tipo botón, en esta nueva entrega nos vamos a centrar en otros tres componentes básicos imprescindibles en nuestras aplicaciones: las imágenes (<span style="font-family: courier new,courier;">ImageView</span>), las etiquetas (<span style="font-family: courier new,courier;">TextView</span>) y por último los cuadros de texto (<span style="font-family: courier new,courier;">EditText</span>).</p>
<p><strong><span style="text-decoration: underline;">Control ImageView</span> [<a title="Android SDK - ImageView" href="http://developer.android.com/reference/android/widget/ImageView.html" target="_blank">API</a>]</strong></p>
<p>El control ImageView permite mostrar imágenes en la aplicación. La propiedad más interesante es <span style="font-family: courier new,courier;">android:src</span>, que permite indicar la imagen a mostrar. Nuevamente, lo normal será indicar como origen de la imagen el identificador de un recurso de nuestra carpeta <span style="font-family: courier new,courier;">/res/drawable</span>, por ejemplo <span style="font-family: courier new,courier;">android:src=&#8221;@drawable/unaimagen&#8221;</span>. Además de esta propiedad, existen algunas otras útiles en algunas ocasiones como las destinadas a establecer el tamaño máximo que puede ocupar la imagen, <span style="font-family: courier new,courier;">android:maxWidth</span> y <span style="font-family: courier new,courier;">android:maxHeight</span>.</p>
<pre class="syntax-highlight:xml">
&lt;ImageView android:id=&quot;@+id/ImgFoto&quot;
    android:layout_width=&quot;wrap_content&quot;
    android:layout_height=&quot;wrap_content&quot;
    android:src=&quot;@drawable/icon&quot; /&gt;
</pre>
<p>En la lógica de la aplicación, podríamos establecer la imagen mediante el método<span style="font-family: courier new,courier;"> setImageResorce(&#8230;)</span>, pasándole el ID del recurso a utilizar como contenido de la imagen.</p>
<pre class="syntax-highlight:java">
ImageView img= (ImageView)findViewById(R.id.ImgFoto);
img.setImageResource(R.drawable.icon);
</pre>
<p><strong><span style="text-decoration: underline;">Control TextView</span> [<a title="Android SDK - TextView" href="http://developer.android.com/reference/android/widget/TextView.html" target="_blank">API</a>]</strong></p>
<p>El control <span style="font-family: courier new,courier;">TextView </span>es otro de los clásicos en la programación de GUIs, las etiquetas de texto, y se utiliza para mostrar un determinado texto al usuario. Al igual que en el caso de los botones, el texto del control se establece mediante la propiedad <span style="font-family: courier new,courier;">android:text</span>. A parte de esta propiedad, la naturaleza del control hace que las más interesantes sean las que establecen el formato del texto mostrado, que al igual que en el caso de los botones son las siguientes: <span style="font-family: courier new,courier;">android:background</span> (color de fondo), <span style="font-family: courier new,courier;">android:textColor</span> (color del texto), <span style="font-family: courier new,courier;">android:textSize</span> (tamaño de la fuente) y<span style="font-family: courier new,courier;"> android:typeface</span> (estilo del texto: negrita, cursiva, &#8230;).</p>
<pre class="syntax-highlight:xml">
&lt;TextView android:id=&quot;@+id/LblEtiqueta&quot;
    android:layout_width=&quot;fill_parent&quot;
    android:layout_height=&quot;wrap_content&quot;
    android:text=&quot;Escribe algo:&quot;
    android:background=&quot;#AA44FF&quot;
    android:typeface=&quot;monospace&quot; /&gt;
</pre>
<p>De igual forma, también podemos manipular estas propiedades desde nuestro código. Como ejemplo, en el siguiente fragmento recuperamos el texto de una etiqueta con <span style="font-family: courier new,courier;">getText()</span>, y posteriormente le concatenamos unos números, actualizamos su contenido mediante <span style="font-family: courier new,courier;">setText()</span> y le cambiamos su color de fondo con <span style="font-family: courier new,courier;">setBackgroundColor()</span>.</p>
<pre class="syntax-highlight:java">
final TextView lblEtiqueta = (TextView)findViewById(R.id.LblEtiqueta);
String texto = lblEtiqueta.getText().toString();
texto += &quot;123&quot;;
lblEtiqueta.setText(texto);
</pre>
<p><strong><span style="text-decoration: underline;">Control EditText</span> [<a title="Android SDK - EditText" href="http://developer.android.com/reference/android/widget/EditText.html" target="_blank">API</a>]</strong></p>
<p>El control <span style="font-family: courier new,courier;">EditText </span>es el componente de edición de texto que proporciona la plataforma Android. Permite la introducción y edición de texto por parte del usuario, por lo que en tiempo de diseño la propiedad más interesante a establecer, además de su posición/tamaño y formato, es el texto a mostrar, atributo <span style="font-family: courier new,courier;">android:text</span>.</p>
<pre class="syntax-highlight:xml">
&lt;EditText android:id=&quot;@+id/TxtTexto&quot;
    android:layout_width=&quot;fill_parent&quot;
    android:layout_height=&quot;wrap_content&quot;
    android:layout_below=&quot;@id/LblEtiqueta&quot; /&gt;
</pre>
<p>De igual forma, desde nuestro código podremos recuperar y establecer este texto mediante los métodos <span style="font-family: courier new,courier;">getText()</span> y <span style="font-family: courier new,courier;">setText(<em>nuevoTexto</em>) </span>respectivamente:</p>
<pre class="syntax-highlight:java">
final EditText txtTexto = (EditText)findViewById(R.id.TxtTexto);
String texto = txtTexto.getText().toString();
txtTexto.setText(&quot;Hola mundo!&quot;);
</pre>
<p>Un detalle que puede haber pasado desapercibido. ¿Os habéis fijado en que hemos tenido que hacer un <span style="font-family: courier new,courier;">toString()</span> sobre el resultado de <span style="font-family: courier new,courier;">getText()</span>? La explicación para esto es que el método <span style="font-family: courier new,courier;">getText()</span> no devuelve un <span style="font-family: courier new,courier;">String</span> sino un objeto de tipo <span style="font-family: courier new,courier;">Editable</span>, que a su vez implementa la interfaz <span style="font-family: courier new,courier;">Spannable</span>. Y esto nos lleva a la característica más interesante del control <span style="font-family: courier new,courier;">EditText</span>, y es que no sólo nos permite editar <em>texto plano</em> sino también <em>texto enriquecido</em> o con formato. Veamos cómo y qué opciones tenemos, y para empezar comentemos algunas cosas sobre los objetos <span style="font-family: courier new,courier;">Spannable</span>.</p>
<p><span style="text-decoration: underline;"><strong>Interfaz Spanned</strong></span></p>
<p>Un objeto de tipo <span style="font-family: courier new,courier;">Spanned </span>es algo así como una cadena de caracteres (deriva de la interfaz <span style="font-family: courier new,courier;">CharSequence</span>) en la que podemos insertar otros objetos a modo de marcas<em> </em>o etiquetas<em> </em>(<em>spans</em>) asociados a rangos de caracteres. De esta interfaz deriva la interfaz <span style="font-family: courier new,courier;">Spannable</span>, que permite la modificación de estas marcas, y a su vez de ésta última deriva la interfaz <span style="font-family: courier new,courier;">Editable</span>, que permite además la modificación del texto.</p>
<p>Aunque en el apartado en el que nos encontramos nos interesaremos principalmente por las marcas de formato de texto, en principio podríamos insertar cualquier tipo de objeto.</p>
<p>Existen muchos tipos de <em>spans </em>predefinidos en la plataforma que podemos utilizar para dar formato al texto, entre ellos:</p>
<ul>
<li><span style="font-family: courier new,courier;">TypefaceSpan</span>. Modifica el tipo de fuente.</li>
<li><span style="font-family: courier new,courier;">StyleSpan</span>. Modifica el estilo del texto (negrita, cursiva, &#8230;).</li>
<li><span style="font-family: courier new,courier;">ForegroudColorSpan</span>. Modifica el color del texto.</li>
<li><span style="font-family: courier new,courier;">AbsoluteSizeSpan</span>. Modifica el tamaño de fuente.</li>
</ul>
<p>De esta forma, para crear un nuevo objeto Editable e insertar una marca de formato podríamos hacer lo siguiente:</p>
<pre class="syntax-highlight:java">
//Creamos un nuevo objeto de tipo Editable
Editable str = Editable.Factory.getInstance().newEditable(&quot;Esto es un simulacro.&quot;);

//Marcamos cono fuente negrita la palabra &quot;simulacro&quot;
str.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 11, 19, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
</pre>
<p>En este ejemplo estamos insertando un span de tipo <span style="font-family: courier new,courier;">StyleSpan </span>para marcar un fragmento de texto con estilo <em>negrita</em>. Para insertarlo utilizamos el método <span style="font-family: courier new,courier;">setSpan()</span>, que recibe como parámetro el objeto <span style="font-family: courier new,courier;">Span </span>a insertar, la posición inicial y final del texto a marcar, y un flag que indica la forma en la que el span se podrá extender al insertarse nuevo texto.</p>
<p><span style="text-decoration: underline;"><strong>Texto con formato en controles TextView y EditText</strong></span></p>
<p>Hemos visto cómo crear un objeto Editable y añadir marcas de formato al texto que contiene, pero todo esto no tendría ningún sentido si no pudiéramos visualizarlo. Como ya podéis imaginar, los controles TextView y EditText nos van a permitir hacer esto. Vemos qué ocurre si asignamos al nuestro control EditText el objeto Editable que hemos creado antes:</p>
<pre class="syntax-highlight:java">
txtTexto.setText(str);
</pre>
<p>Tras ejecutar este código veremos como efectivamente en el cuadro de texto aparece el mensaje con el formato esperado:</p>
<p><a href="http://www.sgoliver.net/blog/wp-content/uploads/2010/08/simulacro.png"><img class="alignnone size-medium wp-image-1385" title="Texto con formato en control EditText" src="http://www.sgoliver.net/blog/wp-content/uploads/2010/08/simulacro-200x300.png" alt="Texto con formato en control EditText" width="200" height="300" /></a></p>
<p>Ya hemos visto cómo asignar texto con y sin formato a un cuadro de texto, pero ¿qué ocurre a la hora de recuperar texto con formato desde el control?. Ya vimos que la función <span style="font-family: courier new,courier;">getText()</span> devuelve un objeto de tipo <span style="font-family: courier new,courier;">Editable </span>y que sobre éste podíamos hacer un <span style="font-family: courier new,courier;">toString()</span>. Pero con esta solución estamos perdiendo todo el formato del texto, por lo que no podríamos por ejemplo salvarlo a una base de datos.</p>
<p>La solución a esto último pasa obviamente por recuperar directamente el objeto <span style="font-family: courier new,courier;">Editable </span>y serializarlo de algún modo, mejor aún si es en un formato estandar. Pues bien, en Android este trabajo ya nos viene hecho de fábrica a través de la clase <span style="font-family: courier new,courier;">Html</span> [<a title="Android SDK - Clase HTML" href="http://developer.android.com/reference/android/text/Html.html#fromHtml%28java.lang.String%29" target="_blank">API</a>], que dispone de métodos para convertir cualquier objeto <span style="font-family: courier new,courier;">Spanned </span>en su representación HTML equivalente. Veamos cómo. Recuperemos el texto de la ventana anterior y utilicemos el método <span style="font-family: courier new,courier;">Html.toHtml(Spannable)</span> para convertirlo a formato HTML:</p>
<pre class="syntax-highlight:java">
//Obtiene el texto del control con etiquetas de formato HTML
String aux2 = Html.toHtml(txtTexto.getText());
</pre>
<p>Haciendo esto, obtendríamos una cadena de texto como la siguiente, que ya podríamos por ejemplo almacenar en una base de datos o publicar en cualquier web sin perder el formato de texto establecido:</p>
<pre class="syntax-highlight:html">
&lt;p&gt;Esto es un &lt;b&gt;simulacro&lt;/b&gt;.&lt;/p&gt;
</pre>
<p>La operación contraria también es posible, es decir, cargar un cuadro de texto de Android (<span style="font-family: courier new,courier;">EditText</span>) o una etiqueta (<span style="font-family: courier new,courier;">TextView</span>) a partir de un fragmento de texto en formato HTML. Para ello podemos utilizar el método <span style="font-family: courier new,courier;">Html.fromHtml(String)</span> de la siguiente forma:</p>
<pre class="syntax-highlight:java">
//Asigna texto con formato HTML
txtTexto.setText(
     Html.fromHtml(&quot;&lt;p&gt;Esto es un &lt;b&gt;simulacro&lt;/b&gt;.&lt;/p&gt;&quot;),
     BufferType.SPANNABLE);
</pre>
<p>Desgraciadamente, aunque es de agradecer que este trabajo venga hecho de casa, hay que decir que tan sólo funciona de forma completa con las opciones de formato más básicas, como negritas, cursivas, subrayado o colores de texto, quedando no soportadas otras sorprendentemente básicas como el tamaño del texto, que aunque sí es correctamente traducido por el método <span style="font-family: courier new,courier;">toHtml()</span>, es descartado por el método contrario <span style="font-family: courier new,courier;">fromHtml()</span>. Sí se soporta la inclusión de imágenes, aunque esto lo dejamos para un artículo aparte (prometido!) ya que requiere algo más de explicación.</p>
<p>Podéis descargar parte del código de este artículo desde <a href='http://www.sgoliver.net/blog/wp-content/uploads/2010/08/android-cuadrosdetexto.zip'>este enlace</a>.</p>
<h3  class="related_post_title">Entradas relacionadas</h3><ul class="related_post"><li><a href="http://www.sgoliver.net/blog/?p=1387" title="Interfaz de usuario en Android: Controles básicos (III)">Interfaz de usuario en Android: Controles básicos (III)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1363" title="Interfaz de usuario en Android: Controles básicos (I)">Interfaz de usuario en Android: Controles básicos (I)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1414" title="Interfaz de usuario en Android: Controles de selección (II)">Interfaz de usuario en Android: Controles de selección (II)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1404" title="Interfaz de usuario en Android: Controles de selección (I)">Interfaz de usuario en Android: Controles de selección (I)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1341" title="Interfaz de usuario en Android: Layouts">Interfaz de usuario en Android: Layouts</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.sgoliver.net/blog/?feed=rss2&amp;p=1373</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Interfaz de usuario en Android: Controles básicos (I)</title>
		<link>http://www.sgoliver.net/blog/?p=1363&amp;utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=interfaz-de-usuario-en-android-controles-basicos-i</link>
		<comments>http://www.sgoliver.net/blog/?p=1363#comments</comments>
		<pubDate>Thu, 19 Aug 2010 08:45:52 +0000</pubDate>
		<dc:creator>sgoliver</dc:creator>
				<category><![CDATA[Móviles]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[básicos]]></category>
		<category><![CDATA[botones]]></category>
		<category><![CDATA[Button]]></category>
		<category><![CDATA[controles]]></category>
		<category><![CDATA[evento]]></category>
		<category><![CDATA[ImageButton]]></category>
		<category><![CDATA[OnClickListener]]></category>
		<category><![CDATA[ToggleButton]]></category>

		<guid isPermaLink="false">http://www.sgoliver.net/blog/?p=1363</guid>
		<description><![CDATA[En el artículo anterior ya vimos los distintos tipos de layouts con los que contamos en Android para distribuir los controles de la interfaz por la pantalla del dispositivo. En los próximos artículos dedicados a Android vamos a hacer un repaso de los diferentes controles que pone a nuestra disposición la plataforma de desarrollo de [...]]]></description>
			<content:encoded><![CDATA[<p>En el <a title="Layouts en Android" href="http://www.sgoliver.net/blog/?p=1341" target="_self">artículo anterior</a> ya vimos los distintos tipos de <em>layouts </em>con los que contamos en Android para distribuir los controles de la interfaz por la pantalla del dispositivo. En los próximos artículos dedicados a Android vamos a hacer un repaso de los diferentes controles que pone a nuestra disposición la plataforma de desarrollo de este sistema operativo. Empezaremos con los controles más básicos y seguiremos posteriormente con algunos algo más elaborados.</p>
<p>En este primer post sobre el tema nos vamos a centrar en los diferentes tipos de botones y cómo podemos personalizarlos. El SDK de Android nos proporciona tres tipos de botones: el clásico (<span style="font-family: courier new,courier;">Button</span>), el de tipo on/off (<span style="font-family: courier new,courier;">ToggleButton</span>), y el que puede contener una imagen (<span style="font-family: courier new,courier;">ImageButton</span>). En la imagen siguiente vemos el aspecto por defecto de estos tres controles.</p>
<p><a href="http://www.sgoliver.net/blog/wp-content/uploads/2010/08/botones11.png"><img class="alignnone size-full wp-image-1378" title="Controles Android: Button, ToggleButton, ImageButton" src="http://www.sgoliver.net/blog/wp-content/uploads/2010/08/botones11.png" alt="Controles Android: Button, ToggleButton, ImageButton" width="206" height="64" /></a></p>
<p>No vamos a comentar mucho sobre ellos dado que son controles de sobra conocidos por todos, ni vamos a enumerar todas sus propiedades porque existen decenas. A modo de referencia, a medida que los vayamos comentando iré poniendo enlaces a su página de la documentación oficial de Android para poder consultar todas sus propiedades en caso de necesidad.</p>
<p><span style="text-decoration: underline;"><strong>Control Button</strong></span><strong> [<a title="Android SDK - Button" href="http://developer.android.com/reference/android/widget/Button.html" target="_blank">API</a>]</strong><span style="text-decoration: underline;"><strong><br />
</strong></span></p>
<p>Un control de tipo <span style="font-family: courier new,courier;">Button </span>es el botón más básico que podemos utilizar. En el ejemplo siguiente definimos un botón con el texto &#8220;Púlsame&#8221; asignando su propiedad <span style="font-family: courier new,courier;">android:text</span>. Además de esta propiedad podríamos utilizar muchas otras como el color de fondo (<span style="font-family: courier new,courier;">android:background</span>), estilo de fuente (<span style="font-family: courier new,courier;">android:typeface</span>), color de fuente (<span style="font-family: courier new,courier;">android:textcolor</span>), tamaño de fuente (<span style="font-family: courier new,courier;">android:textSize</span>), etc.</p>
<pre class="syntax-highlight:xml">
&lt;Button android:id=&quot;@+id/BtnBoton1&quot;
	android:text=&quot;Púlsame&quot;
	android:layout_width=&quot;wrap_content&quot;
	android:layout_height=&quot;wrap_content&quot; /&gt;
</pre>
<p><strong><span style="text-decoration: underline;">Control ToggleButton</span> [<a title="Android SDK - ToggleButton" href="http://developer.android.com/reference/android/widget/ToggleButton.html" target="_blank">API</a>]</strong></p>
<p>Un control de tipo <span style="font-family: courier new,courier;">ToggleButton </span>es un tipo de botón que puede permanecer en dos estados, pulsado/no_pulsado. En este caso, en vez de definir un sólo texto para el control definiremos dos, dependiendo de su estado. Así, podremos asignar las propiedades <span style="font-family: courier new,courier;">android:textOn</span> y<span style="font-family: courier new,courier;"> android:textoOff</span> para definir ambos textos. Veamos un ejemplo a continuación.</p>
<pre class="syntax-highlight:xml">
&lt;ToggleButton android:id=&quot;@+id/BtnBoton2&quot;
	android:textOn=&quot;ON&quot;
	android:textOff=&quot;OFF&quot;
	android:layout_width=&quot;wrap_content&quot;
	android:layout_height=&quot;wrap_content&quot; /&gt;
</pre>
<p><strong><span style="text-decoration: underline;">Control ImageButton</span> [<a title="Android SDK - ImageButton" href="http://developer.android.com/reference/android/widget/ImageButton.html" target="_blank">API</a>]</strong></p>
<p>En un control de tipo <span style="font-family: courier new,courier;">ImageButton </span>podremos definir una imagen a mostrar en vez de un texto, para lo que deberemos asignar la propiedad <span style="font-family: courier new,courier;">android:src</span>. Normalmente asignaremos esta propiedad con el descriptor de algún recurso que hayamos incluido en la carpeta /res/drawable. Así, por ejemplo, en nuestro caso hemos incluido una imagen llamada &#8220;<em>ok.png</em>&#8221; por lo que haremos referencia al recurso &#8220;<span style="font-family: courier new,courier;">@drawable/ok</span>&#8220;<strong>.</strong></p>
<pre class="syntax-highlight:xml">
&lt;ImageButton android:id=&quot;@+id/BtnBoton3&quot;
	android:layout_width=&quot;wrap_content&quot;
	android:layout_height=&quot;wrap_content&quot;
	android:src=&quot;@drawable/ok&quot; /&gt;
</pre>
<p><span style="text-decoration: underline;"><strong>Eventos de un botón</strong></span></p>
<p>Como podéis imaginar, aunque estos controles pueden lanzar muchos otros eventos, el más común de todos ellos y el que querremos capturar en la mayoría de las ocasiones es el evento <span style="font-family: courier new,courier;">onClick</span>. Para definir la lógica de este evento tendremos que implementarla definiendo un nuevo objeto <span style="font-family: courier new,courier;">View.OnClickListener()</span> y asociándolo al botón mediante el método <span style="font-family: courier new,courier;">setOnClickListener()</span>. La forma más habitual de hacer esto es la siguiente:</p>
<pre class="syntax-highlight:java">
final Button btnBoton1 = (Button)findViewById(R.id.BtnBoton1);

btnBoton1.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View arg0)
	{
		lblMensaje.setText(&quot;Botón 1 pulsado!&quot;);
	}
});
</pre>
<p>En el caso de un botón de tipo ToggleButton suele ser de utilidad conocer en qué estado ha quedado el botón tras ser pulsado, para lo que podemos utilizar su método <span style="font-family: courier new,courier;">isChecked()</span>. En el siguiente ejemplo se comprueba el estado del botón tras ser pulsado y se realizan acciones distintas según el resultado.</p>
<pre class="syntax-highlight:java">
final ToggleButton btnBoton2 = (ToggleButton)findViewById(R.id.BtnBoton2);

btnBoton2.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View arg0)
	{
		if(btnBoton2.isChecked())
			lblMensaje.setText(&quot;Botón 2: ON&quot;);
		else
			lblMensaje.setText(&quot;Botón 2: OFF&quot;);
	}
});
</pre>
<p><span style="text-decoration: underline;"><strong>Personalizar el aspecto un botón [y otros controles]<br />
</strong></span></p>
<p>En la imagen anterior vimos el aspecto que presentan por defecto los tres tipos de botones disponibles. Pero, ¿y si quisiéramos personalizar su aspecto más allá de cambiar un poco el tipo o el color de la letra o el fondo?</p>
<p>Para cambiar la forma de un botón podríamos simplemente asignar una imagen a la propiedad <span style="font-family: courier new,courier;">android:background</span>, pero esta solución no nos serviría de mucho porque siempre se mostraría la misma imagen incluso con el botón pulsado, dando poca sensación de elemento &#8220;clickable&#8221;.</p>
<p>La solución perfecta pasaría por tanto por definir diferentes imágenes de fondo dependiendo del estado del botón. Pues bien, Android nos da total libertad para hacer esto mediante el uso de <em>selectores</em>. Un <em>selector </em>se define mediante un fichero XML localizado en la carpeta <span style="font-family: courier new,courier;">/res/drawable,</span> y en él se pueden establecer los diferentes valores de una propiedad determinada de un control dependiendo de su estado.</p>
<p>Por ejemplo, si quisiéramos dar un aspecto plano a un botón <span style="font-family: courier new,courier;">ToggleButton</span>, podríamos diseñar las imágenes necesarias para los estados &#8220;pulsado&#8221; (en el ejemplo <em>toggle_on.png</em>) y &#8220;no pulsado&#8221; (en el ejemplo <em>toggle_off.png</em>) y crear un selector como el siguiente:</p>
<pre class="syntax-highlight:xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;selector
    xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;&gt;

    &lt;item android:state_checked=&quot;false&quot;
            android:drawable=&quot;@drawable/toggle_off&quot; /&gt;
    &lt;item android:state_checked=&quot;true&quot;
            android:drawable=&quot;@drawable/toggle_on&quot; /&gt;

&lt;/selector&gt;
</pre>
<p>Este selector lo guardamos por ejemplo en un fichero llamado <em>toggle_style.xml</em> y lo colocamos como un recurso más en nuestra carpeta de recursos <span style="font-family: courier new,courier;">/res/drawable</span>. Hecho esto, tan sólo bastaría hacer referencia a este nuevo recurso que hemos creado en la propiedad <span style="font-family: courier new,courier;">android:background</span> del botón:</p>
<pre class="syntax-highlight:xml">
&lt;ToggleButton android:id=&quot;@+id/BtnBoton4&quot;
	android:textOn=&quot;ON&quot;
	android:textOff=&quot;OFF&quot;
	android:padding=&quot;10dip&quot;
	android:layout_width=&quot;wrap_content&quot;
	android:layout_height=&quot;wrap_content&quot;
	android:background=&quot;@drawable/toggle_style&quot;/&gt;
</pre>
<p>En la siguiente imagen vemos el aspecto por defecto de un ToggleButton y cómo ha quedado nuestro ToggleButton personalizado.</p>
<p><a href="http://www.sgoliver.net/blog/wp-content/uploads/2010/08/botones2.png"><img class="alignnone size-full wp-image-1379" title="Android: Control ToggleButton personalizado" src="http://www.sgoliver.net/blog/wp-content/uploads/2010/08/botones2.png" alt="Android: Control ToggleButton personalizado" width="125" height="100" /></a></p>
<p>Podéis descargar el código fuente de este artículo desde el siguiente enlace: <a href="http://www.sgoliver.net/blog/wp-content/uploads/2010/08/android-botones.zip">android-botones</a>.</p>
<h3  class="related_post_title">Entradas relacionadas</h3><ul class="related_post"><li><a href="http://www.sgoliver.net/blog/?p=1387" title="Interfaz de usuario en Android: Controles básicos (III)">Interfaz de usuario en Android: Controles básicos (III)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1373" title="Interfaz de usuario en Android: Controles básicos (II)">Interfaz de usuario en Android: Controles básicos (II)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1414" title="Interfaz de usuario en Android: Controles de selección (II)">Interfaz de usuario en Android: Controles de selección (II)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1404" title="Interfaz de usuario en Android: Controles de selección (I)">Interfaz de usuario en Android: Controles de selección (I)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1341" title="Interfaz de usuario en Android: Layouts">Interfaz de usuario en Android: Layouts</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.sgoliver.net/blog/?feed=rss2&amp;p=1363</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Interfaz de usuario en Android: Layouts</title>
		<link>http://www.sgoliver.net/blog/?p=1341&amp;utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=interfaz-de-usuario-en-android-layouts</link>
		<comments>http://www.sgoliver.net/blog/?p=1341#comments</comments>
		<pubDate>Tue, 17 Aug 2010 19:14:40 +0000</pubDate>
		<dc:creator>sgoliver</dc:creator>
				<category><![CDATA[Móviles]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[controles]]></category>
		<category><![CDATA[distribuir]]></category>
		<category><![CDATA[FrameLayout]]></category>
		<category><![CDATA[interfaz]]></category>
		<category><![CDATA[layout]]></category>
		<category><![CDATA[LinearLayout]]></category>
		<category><![CDATA[organizar]]></category>
		<category><![CDATA[RelativeLayout]]></category>
		<category><![CDATA[TableLayout]]></category>
		<category><![CDATA[usuario]]></category>
		<category><![CDATA[ViewGroup]]></category>

		<guid isPermaLink="false">http://www.sgoliver.net/blog/?p=1341</guid>
		<description><![CDATA[En el artículo anterior, donde desarrollamos una sencilla aplicación Android desde cero, ya hicimos algunos comentarios sobre los layouts. Como ya indicamos, los layouts son elementos no visuales destinados a controlar la distribución, posición y dimensiones de los controles que se insertan en su interior. Estos componentes extienden a la clase base ViewGroup, como muchos [...]]]></description>
			<content:encoded><![CDATA[<p>En el <a title="Desarrollando una aplicación Android desde cero" href="http://www.sgoliver.net/blog/?p=1316" target="_self">artículo anterior</a>, donde desarrollamos una sencilla aplicación Android desde cero, ya hicimos algunos comentarios sobre los <em>layouts</em>. Como ya indicamos, los <em>layouts </em>son elementos no visuales destinados a controlar la distribución, posición y dimensiones de los controles que se insertan en su interior. Estos componentes extienden a la clase base <span style="font-family: courier new,courier;">ViewGroup</span>, como muchos otros componentes contenedores, es decir, capaces de contener a otros controles. En el post anterior conocimos la existencia de un tipo concreto de layout, <span style="font-family: courier new,courier;">LinearLayout</span>, aunque Android nos proporciona algunos otros. Veámos cuántos y cuáles.</p>
<p><span style="text-decoration: underline;"><strong>FrameLayout</strong></span></p>
<p>Éste es el más simple de todos los layouts de Android. Un <span style="font-family: courier new,courier;">FrameLayout</span> coloca todos sus controles hijos alineados con su esquina superior izquierda, de forma que cada control quedará oculto por el control siguiente (a menos que éste último tenga transparencia). Por ello, suele utilizarse para mostrar un único control en su interior, a modo de contenedor (<em>placeholder</em>) sencillo para un sólo elemento sustituible, por ejemplo una imagen.</p>
<p>Los componentes incluidos en un <span style="font-family: courier new,courier;">FrameLayout </span>podrán establecer sus propiedades <span style="font-family: courier new,courier;">android:layout_width</span> y <span style="font-family: courier new,courier;">android:layout_height</span>, que podrán tomar los valores &#8220;<span style="font-family: courier new,courier;">fill_parent</span>&#8221; (para que el control hijo tome la dimensión de su layout contenedor) o &#8220;<span style="font-family: courier new,courier;">wrap_content</span>&#8221; (para que el control hijo tome la dimensión de su contenido).</p>
<p>Ejemplo:</p>
<pre class="syntax-highlight:xml">
&lt;FrameLayout
    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;&gt;

    &lt;EditText android:id=&quot;@+id/TxtNombre&quot;
        android:layout_width=&quot;fill_parent&quot;
        android:layout_height=&quot;fill_parent&quot; /&gt;

&lt;/FrameLayout&gt;
</pre>
<p><span style="text-decoration: underline;"><strong>LinearLayout</strong></span></p>
<p>El siguiente layout Android en cuanto a nivel de complejidad es el <span style="font-family: courier new,courier;">LinearLayout</span>. Este layout apila uno tras otro todos sus elementos hijos de forma horizontal o vertical según se establezca su propiedad <span style="font-family: courier new,courier;">android:orientation</span>.</p>
<p>Al igual que en un <span style="font-family: courier new,courier;">FrameLayout</span>, los elementos contenidos en un <span style="font-family: courier new,courier;">LinearLayout </span>pueden establecer sus propiedades <span style="font-family: courier new,courier;">android:layout_width</span> y <span style="font-family: courier new,courier;">android:layout_height</span> para determinar sus dimensiones dentro del layout. Pero en el caso de un <span style="font-family: courier new,courier;">LinearLayout</span>, tendremos otro parámetro con el que jugar, la propiedad <span style="font-family: courier new,courier;">android:layout_weight</span>.</p>
<pre class="syntax-highlight:xml">
&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;EditText android:id=&quot;@+id/TxtNombre&quot;
        android:layout_width=&quot;fill_parent&quot;
        android:layout_height=&quot;fill_parent&quot; /&gt;

    &lt;Button android:id=&quot;@+id/BtnAceptar&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;fill_parent&quot; /&gt;

&lt;/LinearLayout&gt;
</pre>
<p>Esta propiedad nos va a permitir dar a los elementos contenidos en el layout unas dimensiones proporcionales entre ellas. Esto es más dificil de explicar que de comprender con un ejemplo. Si incluimos en un <span style="font-family: courier new,courier;">LinearLayout </span>vertical dos cuadros de texto (<span style="font-family: courier new,courier;">EditText</span>) y a uno de ellos le establecemos un <span style="font-family: courier new,courier;">layout_weight=&#8221;1&#8243;</span> y al otro un <span style="font-family: courier new,courier;">layout_weight=&#8221;2&#8243;</span> conseguiremos como efecto que toda la superficie del layout quede ocupada por los dos cuadros de texto y que además el segundo sea el doble (relación entre sus propiedades <span style="font-family: courier new,courier;">weight</span>) de alto que el primero.</p>
<pre class="syntax-highlight:xml">
&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;EditText android:id=&quot;@+id/TxtDato1&quot;
        android:layout_width=&quot;fill_parent&quot;
        android:layout_height=&quot;fill_parent&quot;
        android:layout_weight=&quot;1&quot; /&gt;

    &lt;EditText android:id=&quot;@+id/TxtDato2&quot;
        android:layout_width=&quot;fill_parent&quot;
        android:layout_height=&quot;fill_parent&quot;
        android:layout_weight=&quot;2&quot; /&gt;

&lt;/LinearLayout&gt;
</pre>
<p>Así pues, a pesar de la simplicidad aparente de este layout resulta ser lo suficiente versátil como para sernos de utilidad en muchas ocasiones.</p>
<p><span style="text-decoration: underline;"><strong>TableLayout</strong></span></p>
<p>Un <span style="font-family: courier new,courier;">TableLayout </span>permite distribuir sus elementos hijos de forma tabular, definiendo las filas y columnas necesarias, y la posición de cada componente dentro de la tabla.</p>
<p>La estructura de la tabla se define de forma similar a como se hace en HTML, es decir, indicando las filas que compondrán la tabla (objetos <span style="font-family: courier new,courier;">TableRow</span>), y dentro de cada fila las columnas necesarias, con la salvedad de que no existe ningún objeto especial para definir una columna (algo así como un <em>TableColumn</em>) sino que directamente insertaremos los controles necesarios dentro del <span style="font-family: courier new,courier;">TableRow</span> y cada componente insertado (que puede ser un control sencillo o incluso otro <span style="font-family: courier new,courier;">ViewGroup</span>) corresponderá a una columna de la tabla. De esta forma, el número final de filas de la tabla se corresponderá con el número de elementos TableRow<span style="font-family: courier new,courier;"> </span>insertados, y el número total de columnas quedará determinado por el número de componentes de la fila que más componentes contenga.</p>
<p>Por norma general, el ancho de cada columna se corresponderá con el ancho del mayor componente de dicha columna, pero existen una serie de propiedades que nos ayudarán a modificar este comportamiento:</p>
<ul>
<li><span style="font-family: courier new,courier;">android:stretchColumns</span>. Indicará las columnas que pueden expandir para absorver el espacio libre dejado por las demás columnas a la derecha de la pantalla.</li>
<li><span style="font-family: courier new,courier;">android:shrinkColumns</span>. Indicará las columnas que se pueden contraer para dejar espacio al resto de columnas que se puedan salir por la derecha de la palntalla.</li>
<li><span style="font-family: courier new,courier;">android:collapseColumns</span>. Indicará las columnas de la tabla que se quieren ocultar completamente.</li>
</ul>
<p>Todas estas propiedades del <span style="font-family: courier new,courier;">TableLayout </span>pueden recibir una lista de índices de columnas separados por comas (ejemplo: <span style="font-family: courier new,courier;">android:stretchColumns=&#8221;1,2,3&#8243;</span>) o un asterisco para indicar que debe aplicar a todas las columnas (ejemplo: <span style="font-family: courier new,courier;">android:stretchColumns=&#8221;*&#8221;</span>).</p>
<p>Otra característica importante es la posibilidad de que una celda determinada pueda ocupar el espacio de varias columnas de la tabla (análogo al atributo <span style="font-family: courier new,courier;">colspan </span>de HTML). Esto se indicará mediante la propiedad <span style="font-family: courier new,courier;">android:layout_span</span> del componente concreto que deberá tomar dicho espacio.</p>
<p>Veamos un ejemplo con varios de estos elementos:</p>
<pre class="syntax-highlight:xml">
&lt;TableLayout
    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:stretchColumns=&quot;1&quot; &gt;

    &lt;TableRow&gt;
        &lt;TextView android:text=&quot;Celda 1.1&quot; /&gt;
        &lt;TextView android:text=&quot;Celda 1.2&quot; /&gt;
    &lt;/TableRow&gt;

    &lt;TableRow&gt;
        &lt;TextView android:text=&quot;Celda 2.1&quot; /&gt;
        &lt;TextView android:text=&quot;Celda 2.2&quot; /&gt;
    &lt;/TableRow&gt;

    &lt;TableRow&gt;
        &lt;TextView android:text=&quot;Celda 3&quot;
               android:layout_span=&quot;2&quot; /&gt;
    &lt;/TableRow&gt;

&lt;/TableLayout&gt;
</pre>
<p><span style="text-decoration: underline;"><strong>RelativeLayout</strong></span></p>
<p>El último tipo de layout que vamos a ver es el <span style="font-family: courier new,courier;">RelativeLayout</span>. Este layout permite especificar la posición de cada elemento de forma relativa a su elemento padre o a cualquier otro elemento incluido en el propio layout. De esta forma, al incluir un nuevo elemento X podremos indicar por ejemplo que debe colocarse <em>debajo del elemento Y</em> y <em>alineado a la derecha del layout padre</em>. Veamos esto en el ejemplo siguiente:</p>
<pre class="syntax-highlight:xml">
&lt;RelativeLayout
        xmlns:android=&quot;http://schemas.android.com/apk/res/android
        android:layout_width=&quot;fill_parent&quot;
        android:layout_height=&quot;fill_parent&quot; &gt;

        &lt;EditText android:id=&quot;@+id/TxtNombre&quot;
              android:layout_width=&quot;fill_parent&quot;
              android:layout_height=&quot;wrap_content&quot; /&gt;

        &lt;Button android:id=&quot;@+id/BtnAceptar&quot;
            android:layout_width=&quot;wrap_content&quot;
            android:layout_height=&quot;wrap_content&quot;
            android:layout_below=&quot;@id/TxtNombre&quot;
            android:layout_alignParentRight=&quot;true&quot; /&gt;

&lt;/RelativeLayout&gt;
</pre>
<p>En el ejemplo, el botón <span style="font-family: courier new,courier;">BtnAceptar </span>se colocará debajo del cuadro de texto <span style="font-family: courier new,courier;">TxtNombre </span>(<span style="font-family: courier new,courier;">android:layout_below=&#8221;@id/TxtNombre&#8221;</span>) y alineado a la derecha del layout padre (<span style="font-family: courier new,courier;">android:layout_alignParentRight=&#8221;true&#8221;</span>), además de dejar un margen a su izquierda de 10 pixeles (<span style="font-family: courier new,courier;">android:layout_marginLeft=&#8221;10px&#8221;</span>).</p>
<p>Al igual que estas tres propiedades, en un RelativeLayout tendremos un sinfín de propiedades para colocar cada control justo donde queramos. Veamos las principales [creo que sus propios nombres explican perfectamente la función de cada una]:</p>
<p>Posición relativa a otro control:</p>
<ul>
<li>android:layout_above.</li>
<li>android:layout_below.</li>
<li>android:layout_toLeftOf.</li>
<li>android:layout_toRightOf.</li>
<li>android:layout_alignLeft.</li>
<li>android:layout_alignRight.</li>
<li>android:layout_alignTop.</li>
<li>android:layout_alignBottom.</li>
<li>android:layout_alignBaseline.</li>
</ul>
<p>Posición relativa al layout padre:</p>
<ul>
<li>android:layout_alignParentLeft.</li>
<li>android:layout_alignParentRight.</li>
<li>android:layout_alignParentTop.</li>
<li>android:layout_alignParentBottom.</li>
<li>android:layout_centerHorizontal.</li>
<li>android:layout_centerVertical.</li>
<li>android:layout_centerInParent.</li>
</ul>
<p>Opciones de margen (también disponibles para el resto de layouts):</p>
<ul>
<li>android:layout_margin.</li>
<li>android:layout_marginBottom.</li>
<li>android:layout_marginTop.</li>
<li>android:layout_marginLeft.</li>
<li>android:layout_marginRight.</li>
</ul>
<p>Opciones de espaciado o padding (también disponibles para el resto de layouts):</p>
<ul>
<li>android:padding.</li>
<li>android:paddingBottom.</li>
<li>android:paddingTop.</li>
<li>android:paddingLeft.</li>
<li>android:paddingRight.</li>
</ul>
<p>En próximos artículos veremos otros elementos comunes que extienden a <span style="font-family: courier new,courier;">ViewGroup</span>, como por ejemplo las vistas de tipo lista (<span style="font-family: courier new,courier;">ListView</span>), de tipo grid (<span style="font-family: courier new,courier;">GridView</span>), y en pestañas (<span style="font-family: courier new,courier;">TabHost</span>/<span style="font-family: courier new,courier;">TabWidget</span>).</p>
<h3  class="related_post_title">Entradas relacionadas</h3><ul class="related_post"><li><a href="http://www.sgoliver.net/blog/?p=1414" title="Interfaz de usuario en Android: Controles de selección (II)">Interfaz de usuario en Android: Controles de selección (II)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1404" title="Interfaz de usuario en Android: Controles de selección (I)">Interfaz de usuario en Android: Controles de selección (I)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1387" title="Interfaz de usuario en Android: Controles básicos (III)">Interfaz de usuario en Android: Controles básicos (III)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1373" title="Interfaz de usuario en Android: Controles básicos (II)">Interfaz de usuario en Android: Controles básicos (II)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1363" title="Interfaz de usuario en Android: Controles básicos (I)">Interfaz de usuario en Android: Controles básicos (I)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.sgoliver.net/blog/?feed=rss2&amp;p=1341</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Desarrollando una aplicación Android sencilla</title>
		<link>http://www.sgoliver.net/blog/?p=1316&amp;utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=desarrollando-una-aplicacion-android-sencilla</link>
		<comments>http://www.sgoliver.net/blog/?p=1316#comments</comments>
		<pubDate>Mon, 16 Aug 2010 17:58:34 +0000</pubDate>
		<dc:creator>sgoliver</dc:creator>
				<category><![CDATA[Móviles]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[aplicación]]></category>
		<category><![CDATA[básicos]]></category>
		<category><![CDATA[conceptos]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[primera]]></category>
		<category><![CDATA[sencillo]]></category>

		<guid isPermaLink="false">http://www.sgoliver.net/blog/?p=1316</guid>
		<description><![CDATA[Después de instalar nuestro entorno de desarrollo para Android y comentar la estructura básica de un proyecto y los diferentes componentes software que podemos utilizar ya es hora de empezar a escribir algo de código. Y como siempre lo mejor es empezar por escribir una aplicación sencilla. En un principio me planteé analizar en este [...]]]></description>
			<content:encoded><![CDATA[<p>Después de <a title="Instalar entorno desarrollo Android" href="http://www.sgoliver.net/blog/?p=1267" target="_self">instalar nuestro entorno de desarrollo para Android</a> y comentar la <a title="Estructura de un proyecto Android" href="http://www.sgoliver.net/blog/?p=1278" target="_self">estructura básica de un proyecto</a> y los diferentes <a title="Componentes de una aplicación Android" href="http://www.sgoliver.net/blog/?p=1295" target="_self">componentes software</a> que podemos utilizar ya es hora de empezar a escribir algo de código. Y como siempre lo mejor es empezar por escribir una aplicación sencilla.</p>
<p>En un principio me planteé analizar en este post el clásico <em>Hola Mundo</em> pero más tarde me pareció que se iban a quedar algunas cosas básicas en el tintero. Así que he versionado a mi manera el <em>Hola Mundo</em> transformándolo en algo así como un <em>Hola Usuario</em>, que es igual de sencilla pero añade un par de cosas interesantes de contar. La aplicación constará de dos pantallas, por un lado la pantalla principal que solicitará un nombre al usuario y una segunda pantalla en la que se mostrará un mensaje personalizado para el usuario. Sencillo, inútil, pero aprenderemos muchos conceptos básicos, que para empezar no está mal.</p>
<p><a href="http://www.sgoliver.net/blog/wp-content/uploads/2010/08/HolaUsuarioSc1.png"><img class="size-medium wp-image-1320 alignleft" title="Hola Usuario Pantalla 1" src="http://www.sgoliver.net/blog/wp-content/uploads/2010/08/HolaUsuarioSc1-202x300.png" alt="Hola Usuario Pantalla 1" width="202" height="300" /></a><a href="http://www.sgoliver.net/blog/wp-content/uploads/2010/08/HolaUsuarioSc2.png"><img class="alignnone size-medium wp-image-1321" title="Hola Usuario Pantalla 2" src="http://www.sgoliver.net/blog/wp-content/uploads/2010/08/HolaUsuarioSc2-201x300.png" alt="Hola Usuario Pantalla 2" width="201" height="300" /></a></p>
<p>En primer lugar vamos a crear un nuevo proyecto Android tal como vimos al final del <a title="Entorno de desarrollo Android" href="http://www.sgoliver.net/blog/?p=1267" target="_self">primer post de la serie</a>. Llamaremos al proyecto &#8220;HolaUsuario&#8221;, indicaremos como target por ejemplo &#8220;Android 1.6&#8243;, daremos un nombre a la aplicación e indicaremos que se cree una actividad llamada &#8220;HolaUsuario&#8221;.</p>
<p><a href="http://www.sgoliver.net/blog/wp-content/uploads/2010/08/HolaUsuarioProyecto.png"><img class="alignnone size-medium wp-image-1318" title="Nuevo Proyecto Hola Usuario" src="http://www.sgoliver.net/blog/wp-content/uploads/2010/08/HolaUsuarioProyecto-214x300.png" alt="Nuevo Proyecto Hola Usuario" width="214" height="300" /></a></p>
<p>Como ya vimos esto nos crea la estructura de carpetas del proyecto y todos los ficheros necesarios de un <em>Hola Mundo</em> básico, es decir, una sola pantalla donde se muestra únicamente un mensaje fijo.</p>
<p>Lo primero que vamos a hacer es diseñar nuestra pantalla principal modificando la que Eclipse nos ha creado por defecto. ¿Pero dónde y cómo se define cada pantalla de la aplicación? En Android, el diseño y la lógica de una pantalla estan separados en dos ficheros distintos. Por un lado, en el fichero  <span style="font-family: courier new,courier;">/res/layout/main.xml</span> tendremos el diseño puramente visual de la pantalla definido como fichero XML y por otro lado, en el fichero  <span style="font-family: courier new,courier;">/src/paquetejava/HolaUsuario.java</span>, encontraremos el código java que determina la lógica de la pantalla.</p>
<p>Vamos a modificar en primer lugar el aspecto de la ventana principal de la aplicación añadiendo los controles (views) que vemos en la primera captura de pantalla. Para ello, vamos a sustituir el contenido del fichero <span style="font-family: courier new,courier;">main.xml</span> por el siguiente:</p>
<pre class="syntax-highlight:xml">
&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:text=&quot;@string/nombre&quot;
	    android:layout_width=&quot;fill_parent&quot;
	    android:layout_height=&quot;wrap_content&quot; /&gt;

	&lt;EditText android:id=&quot;@+id/TxtNombre&quot;
		android:layout_height=&quot;wrap_content&quot;
		android:layout_width=&quot;fill_parent&quot; /&gt;

	&lt;Button android:id=&quot;@+id/BtnHola&quot;
		android:layout_width=&quot;wrap_content&quot;
		android:layout_height=&quot;wrap_content&quot;
		android:text=&quot;@string/hola&quot; /&gt;

&lt;/LinearLayout&gt;
</pre>
<p>En este XML se definen los elementos visuales que componen la interfaz de nuestra pantalla principal y se especifican todas sus propiedades. No nos detendremos mucho en cada detalle porque ése será tema de otro artículo, pero expliquemos un poco lo que vemos en el fichero.</p>
<p>Lo primero que nos encontramos es un elemento <span style="font-family: courier new,courier;">LinearLayout</span>. Los <em>layout </em>son elementos no visibles que determinan cómo se van a distribuir en el espacio los controles que incluyamos en su interior. Los programadores java, y más concretamente de <em>Swing</em>, conocerán este concepto perfectamente. En este caso, un <span style="font-family: courier new,courier;">LinearLayout</span> distribuirá los controles uno tras otro y en la orientación que indique su propiedad <span style="font-family: courier new,courier;">android:orientation</span>.</p>
<p>Dentro del layout hemos incluido 3 controles: una etiqueta (<span style="font-family: courier new,courier;">TextView</span>), un cuadro de texto (<span style="font-family: courier new,courier;">EditText</span>), y un botón (<span style="font-family: courier new,courier;">Button</span>). En todos ellos hemos establecido las siguientes propiedades:</p>
<ul>
<li> <span style="font-family: courier new,courier;">android:id</span>. ID del control, con el que podremos identificarlo más tarde en nuestro código.Vemos que el identificador lo escribimos precedido de &#8220;@+id/&#8221;. Esto tendrá como efecto que al compilarse el proyecto se genere automáticamente una nueva constante en la clase R para dicho control [<a title="Estructura de un proyecto Android" href="http://www.sgoliver.net/blog/?p=1278" target="_self">Aprende más sobre la clase R</a> en el post anterior].</li>
<li><span style="font-family: courier new,courier;">android:text</span>. Texto del control. El texto de un control se puede especificar directamente o bien utilizar alguna de las cadenas de texto definidas en los <a title="Estructura de un proyecto Android" href="http://www.sgoliver.net/blog/?p=1278" target="_self">recursos del proyecto</a> (fichero <em>strings.xml</em>), en cuyo caso indicaremos su identificador precedido del prefijo &#8220;@string/&#8221;.</li>
<li><span style="font-family: courier new,courier;">android:layout_height</span> y <span style="font-family: courier new,courier;">android:layout_width</span>. Dimensiones del control con respecto al layout que lo contiene. Esta propiedad tomará normalmente los valores &#8220;<span style="font-family: courier new,courier;">wrap_content</span>&#8221; para indicar que las dimensiones del control se ajustarán al contenido del mismo, o bien &#8220;<span style="font-family: courier new,courier;">fill_parent</span>&#8221; para indicar que el ancho o el alto del control se ajustará al ancho o alto del layout contenedor respectivamente.</li>
</ul>
<p>Con esto ya tenemos definida la presentación visual de nuestra ventana principal de la aplicación. De igual forma definiremos la interfaz de la segunda pantalla, creando un nuevo fichero llamado <em>frmmensaje.xml</em>, y añadiendo esta vez tan solo una etiqueta (<span style="font-family: courier new,courier;">TextView</span>) para mostrar el mensaje personalizado al usuario. Veamos cómo quedaría nuestra segunda pantalla:</p>
<pre class="syntax-highlight:xml">
&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;TextView android:id=&quot;@+id/TxtMensaje&quot;
	android:layout_height=&quot;wrap_content&quot;
	android:layout_width=&quot;fill_parent&quot;
	android:text=&quot;$mensaje&quot;&gt;&lt;/TextView&gt;

&lt;/LinearLayout&gt;
</pre>
<p>Una vez definida la interfaz de las pantallas de la aplicación deberemos implementar la lógica de la misma. Como ya hemos comentado, la lógica de la aplicación se definirá en ficheros java independientes. Para la pantalla principal ya tenemos creado un fichero por defecto llamado <em>HolaUsuario.java</em>. Empecemos por comentar su código por defecto:</p>
<pre class="syntax-highlight:java">
public class HolaUsuario extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}
</pre>
<p>Como ya vimos en un <a title="Componentes de una aplicación Android" href="http://www.sgoliver.net/blog/?p=1295" target="_self">post anterior</a>, las diferentes pantallas de una aplicación Android se definen mediante objetos de tipo <span style="font-family: courier new,courier;">Activity</span>. Por tanto, lo primero que encontramos en nuestro fichero java es la definición de una nueva clase <span style="font-family: courier new,courier;">HolaUsuario</span> que extiende a <span style="font-family: courier new,courier;">Activity</span>. El único método que sobreescribiremos de esta clase será el método <span style="font-family: courier new,courier;">OnCreate</span>, llamado cuando se crea por primera vez la actividad. En este método lo único que encontramos en principio, además de la llamada a su implementación en la clase padre, es la llamada al método <span style="font-family: courier new,courier;">setContentView(R.layout.main)</span>. Con esta llamada estaremos indicando a Android que debe establecer como interfaz gráfica de esta actividad la definida en el recurso <span style="font-family: courier new,courier;">R.layout.main</span>, que no es más que la que hemos especificado en el fichero <em>/res/layout/main.xml</em>. Una vez más vemos la utilidad de las diferentes constantes de recursos creadas automáticamente en la clase R al compilar el proyecto.</p>
<p>En principio vamos a crear una nueva actividad para la segunda pantalla de la aplicación análoga a ésta primera, para lo que crearemos una nueva clase <span style="font-family: courier new,courier;">FrmMensaje</span> que exienda de <span style="font-family: courier new,courier;">Activity</span> y que implemente el método <span style="font-family: courier new,courier;">onCreate</span> indicando que utilice la interfaz definida en <span style="font-family: courier new,courier;">R.layout.frmmensaje</span>.</p>
<pre class="syntax-highlight:java">
public class FrmMensaje extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.frmmensaje);
    }
}
</pre>
<p>Como vemos, el código incluido por defecto en estas clases lo único que hace es generar la interfaz de la actividad. A partir de aquí nosotros tendremos que incluir el resto de la lógica de la aplicación. Y vamos a empezar con la actividad principal <span style="font-family: courier new,courier;">HolaUsuario</span>, obteniendo una referencia a los diferentes controles de la interfaz que necesitemos manipular, en nuestro caso sólo el cuadro de texto y el botón. Para ello utilizaremos el método <span style="font-family: courier new,courier;">findViewById() </span>indicando el ID de cada control, definidos como siempre en la clase R:</p>
<pre class="syntax-highlight:java">
final EditText txtNombre = (EditText)findViewById(R.id.TxtNombre);
final Button btnHola = (Button)findViewById(R.id.BtnHola);
</pre>
<p>Una vez tenemos acceso a los diferentes controles, ya sólo nos queda implementar las acciones a tomar cuando pulsemos el botón de la pantalla. Para ello implementaremos el evento onClick de dicho botón, veamos cómo:</p>
<pre class="syntax-highlight:java">
btnHola.setOnClickListener(new OnClickListener() {
	@Override
	public void onClick(View arg0) {
		Intent intent = new Intent(HolaUsuario.this, FrmMensaje.class);

		Bundle bundle = new Bundle();
		bundle.putString(&quot;NOMBRE&quot;, txtNombre.getText().toString());
		intent.putExtras(bundle);

		startActivity(intent);
	}
});
</pre>
<p>Como ya indicamos en el <a title="Componentes de una aplicación Android" href="http://www.sgoliver.net/blog/?p=1295" target="_self">artículo anterior</a>, la comunicación entre los distintos componentes y aplicaciones en Android se realiza mediante <em>intents</em>, por lo que el primer paso será crear un objeto de este tipo. Existen varias variantes del constructor de la clase <span style="font-family: courier new,courier;">Intent</span>, cada una de ellas dirigida a unas determinadas acciones, pero en nuestro caso particular vamos a utilizar el <em>intent</em> para llamar a una actividad desde otra de la misma aplicación, para lo que pasaremos al constructor una referencia a la propia actividad llamadora (<span style="font-family: courier new,courier;">HolaUsuario.this</span>), y la clase de la actividad llamada (<span style="font-family: courier new,courier;">FrmMensaje.class</span>).</p>
<p>Si quisiéramos tan sólo mostrar una nueva actividad ya tan sólo nos quedaría llamar a <span style="font-family: courier new,courier;">startActivity()</span> pasándole como parámetro el <em>intent</em> creado. Pero en nuestro ejemplo queremos también pasarle cierta información a la actividad, concretamente el nombre que introduzca el usuario en el cuadro de texto. Para hacer esto vamos a crear un objeto <span style="font-family: courier new,courier;">Bundle</span>, que puede contener una lista de pares clave-valor con toda la información a pasar entre las actividades. En nuestro caso sólo añadiremos un dato de tipo <span style="font-family: courier new,courier;">String</span> mediante el método <span style="font-family: courier new,courier;">putString(<em>clave</em>, <em>valor</em>)</span>. Tras esto añadiremos la información al <em>intent</em> mediante el método <span style="font-family: courier new,courier;">putExtras(<em>bundle</em>)</span>.</p>
<p>Finalizada la actividad principal de la aplicación pasamos ya a la secundaria. Comenzaremos de forma análoga a la anterior, ampliando el método <span style="font-family: courier new,courier;">onCreate</span> obteniendo las referencias a los objetos que manipularemos, esta vez sólo la etiqueta de texto. Tras esto viene lo más interesante, debemos recuperar la información pasada desde la actividad principal y asignarla como texto de la etiqueta. Para ello accederemos en primer lugar al <em>intent</em> que ha originado la actividad actual mediante el método <span style="font-family: courier new,courier;">getIntent()</span> y recuperaremos su información asociada (objeto <span style="font-family: courier new,courier;">Bundle</span>) mediante el método <span style="font-family: courier new,courier;">getExtras()</span>.</p>
<p>Hecho esto tan sólo nos queda construir el texto de la etiqueta mediante su método <span style="font-family: courier new,courier;">setText(<em>text</em>o)</span> y recuperando el valor de nuestra clave almacenada en el objeto <span style="font-family: courier new,courier;">Bundle</span> mediante <span style="font-family: courier new,courier;">getString(<em>clave</em>)</span>.</p>
<pre class="syntax-highlight:java">
public class FrmMensaje extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.frmmensaje);

        TextView txtMensaje = (TextView)findViewById(R.id.TxtMensaje);

        Bundle bundle = getIntent().getExtras();

        txtMensaje.setText(&quot;Hola &quot; + bundle.getString(&quot;NOMBRE&quot;));
    }
}
</pre>
<p>Con esto hemos concluido la lógica de las dos pantallas de nuestra aplicación y tan sólo nos queda un paso importante para finalizar nuestro desarrollo. Como indicamos en <a title="Estructura de un proyecto Android" href="http://www.sgoliver.net/blog/?p=1278" target="_self">uno de los artículos anteriores</a>, cualquier aplicación Android utiliza un fichero especial en formato XML (<em>AndroidManifest.xml</em>) para definir, entre otras cosas, los diferentes elementos que la componen. Por tanto, todas las actividades de nuestra aplicación deben quedar convenientemente recogidas en este fichero. La actividad principal ya debe aparecer puesto que se creó de forma automática al crear el nuevo proyecto Android, por lo que debemos añadir tan sólo la segunda. Para este ejemplo nos limitaremos a incluir la actividad en el XML, más adelante veremos que opciones adicionales podemos especificar.</p>
<pre class="syntax-highlight:xml">
&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.sgoliver&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;.HolaUsuario&quot;
                  android:label=&quot;@string/app_name&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;

    	&lt;activity android:name=&quot;.FrmMensaje&quot;&gt;&lt;/activity&gt;
     &lt;/application&gt;

    &lt;uses-sdk android:minSdkVersion=&quot;4&quot; /&gt;

&lt;/manifest&gt;
</pre>
<p>Una vez llegado aquí, si todo ha ido bien, deberíamos poder ejecutar el proyecto sin errores y probar nuestra aplicación en el emulador.</p>
<p>Descarga el <a href='http://www.sgoliver.net/blog/wp-content/uploads/2010/08/HolaUsuario.zip'>código fuente de este artículo</a>.</p>
<p>Espero que esta aplicación de ejemplo os haya servido para aprender temas básicos en el desarrollo para Android, como por ejemplo la definición de la interfaz gráfica, el código java necesario para acceder y manipular los elementos de dicha interfaz, o la forma de comunicar diferentes actividades de Android. En los artículos siguientes veremos algunos de estos temas de forma más específica y ampliaremos con algunos temas más avanzados.</p>
<h3  class="related_post_title">Entradas relacionadas</h3><ul class="related_post"><li><a href="http://www.sgoliver.net/blog/?p=1387" title="Interfaz de usuario en Android: Controles básicos (III)">Interfaz de usuario en Android: Controles básicos (III)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1373" title="Interfaz de usuario en Android: Controles básicos (II)">Interfaz de usuario en Android: Controles básicos (II)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1363" title="Interfaz de usuario en Android: Controles básicos (I)">Interfaz de usuario en Android: Controles básicos (I)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1295" title="Componentes de una aplicación Android">Componentes de una aplicación Android</a></li><li><a href="http://www.sgoliver.net/blog/?p=1414" title="Interfaz de usuario en Android: Controles de selección (II)">Interfaz de usuario en Android: Controles de selección (II)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.sgoliver.net/blog/?feed=rss2&amp;p=1316</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Más aplicaciones Android recomendadas</title>
		<link>http://www.sgoliver.net/blog/?p=1304&amp;utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=mas-aplicaciones-android-recomendadas</link>
		<comments>http://www.sgoliver.net/blog/?p=1304#comments</comments>
		<pubDate>Thu, 12 Aug 2010 09:31:18 +0000</pubDate>
		<dc:creator>sgoliver</dc:creator>
				<category><![CDATA[Móviles]]></category>
		<category><![CDATA[Recursos]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[aplicaciones]]></category>
		<category><![CDATA[gesture search]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[my tracks]]></category>
		<category><![CDATA[recomendadas]]></category>

		<guid isPermaLink="false">http://www.sgoliver.net/blog/?p=1304</guid>
		<description><![CDATA[Tras unos días más trasteando con mi HTC Desire quiero compartir con vosotros dos nuevas aplicaciones Android que han pasado a formar parte de mi lista de aplicaciones Android recomendadas. La primera de ellas es de búsqueda. Ya os recomendé en mi lista anterior varias aplicaciones Android excelentes para buscar por todo tipo de criterios [...]]]></description>
			<content:encoded><![CDATA[<p>Tras unos días más trasteando con mi HTC Desire quiero compartir con vosotros dos nuevas aplicaciones Android que han pasado a formar parte de mi lista de aplicaciones Android recomendadas.</p>
<p>La primera de ellas es de búsqueda. Ya os recomendé en <a title="Lista de aplicaciones Android recomendadas" href="http://www.sgoliver.net/blog/?p=1233" target="_self">mi lista anterior</a> varias aplicaciones Android excelentes para buscar por todo tipo de criterios y elementos, buscar por texto, por imágenes, por sonidos, por posición&#8230; y sólo me quedaba poder buscar <em>por gestos</em>, escribiendo directamente sobre la pantalla. Para ello he encontrado y recomiendo <a title="Google Gesture Search" href="http://gesturesearch.googlelabs.com/" target="_blank"><strong>Gesture Search</strong></a>. Esta aplicación llega directamente de la mano del equipo de <a title="Google Labs" href="http://www.googlelabs.com/" target="_blank">Google Labs</a>, y permite buscar y localizar rápidamente elementos entre nuestras aplicaciones, contactos, bookmarks y música con tan sólo escribir sobre la pantalla parte de su nombre.</p>
<p><a href="http://www.sgoliver.net/blog/wp-content/uploads/2010/08/gesture-search.png"><img class="alignnone size-medium wp-image-1305" title="Google Gesture Search" src="http://www.sgoliver.net/blog/wp-content/uploads/2010/08/gesture-search-180x300.png" alt="Google Gesture Search" width="180" height="300" /></a></p>
<p>Y en segundo lugar otra aplicación de Google Labs. Esta vez enfocada más hacia el ocio, y más concretamente al deporte (sí, Android también sirve para practicar deporte). La aplicación en cuestión se llama <strong><a title="Google My Tracks" href="http://mytracks.appspot.com/" target="_blank">My Tracks</a></strong>, y permite ir registrando en tiempo real nuestra posición, utilizando el GPS de nuestro dispositivo, y visualizando estadísticas como la distancia, tiempo, velocidad, elevación o la pendiente mientras realizamos nuestro deporte preferido, ya sea <em>running</em>, senderismo, ciclismo&#8230;</p>
<p>Tanto al final de nuestro recorrido, como en cualquier momento podemos visualizar sobre Google Maps la ruta que hemos seguido hasta el momento, nuestra posición actual, las estadísticas acumuladas hasta ese punto y gráficos con la evolución de nuestra velocidad y la elevación del terreno. Y una de las características que más me han gustado, puedes configurar la aplicación para que de forma periodica te diga a viva voz (anuncios de voz) tus estadísticas en cada momento (distancia recorrida, tiempo invertido y velocidad media).</p>
<p><a href="http://www.sgoliver.net/blog/wp-content/uploads/2010/08/google-my-tracks.png"><img class="alignnone size-medium wp-image-1306" title="Google My Tracks" src="http://www.sgoliver.net/blog/wp-content/uploads/2010/08/google-my-tracks-300x224.png" alt="Google My Tracks" width="300" height="224" /></a></p>
<p>Además, como motivación adicional esta aplicación es <em>open source</em>, por lo que si eres atrevido, y con los conocimientos necesarios, puedes incluso adaptarla a tus necesidades si descubres que le falta alguna característica de vital importancia para ti. Por mi parte, intentaré que en los anuncios por voz me indique también el tiempo medio por kilómetro, y me registre de forma periódica estadísticas parciales cada cierto número de kilómetros (por ahora esta opción es manual). Os mantendré informados si consigo avances.</p>
<h3  class="related_post_title">Entradas relacionadas</h3><ul class="related_post"><li><a href="http://www.sgoliver.net/blog/?p=1233" title="Mi lista de aplicaciones Android">Mi lista de aplicaciones Android</a></li><li><a href="http://www.sgoliver.net/blog/?p=1414" title="Interfaz de usuario en Android: Controles de selección (II)">Interfaz de usuario en Android: Controles de selección (II)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1404" title="Interfaz de usuario en Android: Controles de selección (I)">Interfaz de usuario en Android: Controles de selección (I)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1387" title="Interfaz de usuario en Android: Controles básicos (III)">Interfaz de usuario en Android: Controles básicos (III)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1373" title="Interfaz de usuario en Android: Controles básicos (II)">Interfaz de usuario en Android: Controles básicos (II)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.sgoliver.net/blog/?feed=rss2&amp;p=1304</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Componentes de una aplicación Android</title>
		<link>http://www.sgoliver.net/blog/?p=1295&amp;utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=componentes-de-una-aplicacion-android</link>
		<comments>http://www.sgoliver.net/blog/?p=1295#comments</comments>
		<pubDate>Wed, 11 Aug 2010 11:04:43 +0000</pubDate>
		<dc:creator>sgoliver</dc:creator>
				<category><![CDATA[Móviles]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[activity]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[aplicación]]></category>
		<category><![CDATA[broadcast receiver]]></category>
		<category><![CDATA[componentes]]></category>
		<category><![CDATA[content provider]]></category>
		<category><![CDATA[intent]]></category>
		<category><![CDATA[service]]></category>
		<category><![CDATA[view]]></category>
		<category><![CDATA[widget]]></category>

		<guid isPermaLink="false">http://www.sgoliver.net/blog/?p=1295</guid>
		<description><![CDATA[En el post anterior vimos la estructura de un proyecto Android y aprendimos dónde colocar cada uno de los elementos que componen una aplicación, tanto elementos de software como recursos gráficos o de datos. En éste nuevo post vamos a centrarnos específicamente en los primeros, es decir, veremos los distintos tipos de componentes de software [...]]]></description>
			<content:encoded><![CDATA[<p>En el post anterior vimos la <a title="Estructura de un proyecto Android" href="http://www.sgoliver.net/blog/?p=1278" target="_self">estructura de un proyecto Android</a> y aprendimos dónde colocar cada uno de los elementos que componen una aplicación, tanto elementos de software como recursos gráficos o de datos. En éste nuevo post vamos a centrarnos específicamente en los primeros, es decir, veremos los distintos tipos de componentes de software con los que podremos construir una aplicación Android.</p>
<p>En Java o .NET estamos acostumbrados a manejar conceptos como <em>ventana</em>, <em>control</em>, <em>eventos </em>o <em>servicios </em>como los elementos básicos en la construcción de una aplicación.</p>
<p>Pues bien, en Android vamos a disponer de esos mismos elementos básicos aunque con un pequeño cambio en la terminología y el enfoque. Repasemos los componentes principales que pueden formar parte de una aplicación Android [Por claridad, y para evitar confusiones al consultar documentación en inglés, intentaré traducir lo menos posible los nombres originales de los componentes].</p>
<p><span style="text-decoration: underline;"><strong>Activity</strong></span></p>
<p>Las <em>actividades </em>(activities) representan el componente principal de la interfaz gráfica de una aplicación Android. Se puede pensar en una <em>actividad </em>como el elemento análogo a una <em>ventana </em>en cualquier otro lenguaje visual.</p>
<p><span style="text-decoration: underline;"><strong>View</strong></span></p>
<p>Los objetos <em>view </em>son los componentes básicos con los que se construye la interfaz gráfica de la aplicación, análogo por ejemplo a los <em>controles </em>de Java o .NET. De inicio, Android pone a nuestra disposición una gran cantidad de controles básicos, como cuadros de texto, botones, listas desplegables o imágenes, aunque también existe la posibilidad de extender la funcionalidad de estos controles básicos o crear nuestros propios controles personalizados.</p>
<p><span style="text-decoration: underline;"><strong>Service</strong></span></p>
<p>Los <em>servicios</em> son componentes sin interfaz gráfica que se ejecutan en segundo plano. En concepto, son exactamente iguales a los servicios presentes en cualquier otro sistema operativo. Los servicios pueden realizar cualquier tipo de acciones, por ejemplo actualizar datos, lanzar notificaciones, o incluso mostrar elementos visuales (<em>activities</em>) si se necesita en algún momento la interacción con del usuario.</p>
<p><span style="text-decoration: underline;"><strong>Content Provider</strong></span></p>
<p>Un <em>content provider</em> es el mecanismo que se ha definido en Android para compartir datos entre aplicaciones. Mediante estos componentes es posible compartir determinados datos de nuestra aplicación sin mostrar detalles sobre su almacenamiento interno, su estructura, o su implementación. De la misma forma, nuestra aplicación podrá acceder a los datos de otra a través de los <em>content provider</em> que se hayan definido.</p>
<p><span style="text-decoration: underline;"><strong>Broadcast Receiver</strong></span></p>
<p>Un <em>broadcast receiver</em> es un componente destinado a detectar y reaccionar ante determinados mensajes o eventos globales generados por el sistema  (por ejemplo: &#8220;Batería baja&#8221;, &#8220;SMS recibido&#8221;, &#8220;Tarjeta SD insertada&#8221;, &#8230;) o por otras aplicaciones (cualquier aplicación puede generar mensajes (<em>intents</em>, en terminología Android) broadcast, es decir, no dirigidos a una aplicación concreta sino a cualquiera que quiera <em>escucharlo</em>).</p>
<p><span style="text-decoration: underline;"><strong>Widget</strong></span></p>
<p>Los <em>widgets </em>son elementos visuales, normalmente interactivos, que pueden mostrarse en la pantalla principal (<em>home screen</em>) del dispositivo Android y recibir actualizaciones periódicas. Permiten mostrar información de la aplicación al usuario directamente sobre la pantalla principal.</p>
<p><span style="text-decoration: underline;"><strong>Intent</strong></span></p>
<p>Un <em>intent </em>es el elemento básico de comunicación entre los distintos componentes Android que hemos descrito anteriormente. Se pueden entender como los <em>mensajes </em>o <em>peticiones </em>que son enviados entre los distintos componentes de una aplicación o entre distintas aplicaciones. Mediante un <em>intent </em>se puede mostrar una <em>actividad </em>desde cualquier otra, iniciar un servicio, enviar un mensaje <em>broadcast</em>, iniciar otra aplicación, etc.</p>
<p>En el siguiente post empezaremos ya a ver algo de código, analizando al detalle una aplicación sencilla.</p>
<h3  class="related_post_title">Entradas relacionadas</h3><ul class="related_post"><li><a href="http://www.sgoliver.net/blog/?p=1316" title="Desarrollando una aplicación Android sencilla">Desarrollando una aplicación Android sencilla</a></li><li><a href="http://www.sgoliver.net/blog/?p=1414" title="Interfaz de usuario en Android: Controles de selección (II)">Interfaz de usuario en Android: Controles de selección (II)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1404" title="Interfaz de usuario en Android: Controles de selección (I)">Interfaz de usuario en Android: Controles de selección (I)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1387" title="Interfaz de usuario en Android: Controles básicos (III)">Interfaz de usuario en Android: Controles básicos (III)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1373" title="Interfaz de usuario en Android: Controles básicos (II)">Interfaz de usuario en Android: Controles básicos (II)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.sgoliver.net/blog/?feed=rss2&amp;p=1295</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Estructura de un proyecto Android</title>
		<link>http://www.sgoliver.net/blog/?p=1278&amp;utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=estructura-de-un-proyecto-android</link>
		<comments>http://www.sgoliver.net/blog/?p=1278#comments</comments>
		<pubDate>Mon, 09 Aug 2010 12:51:23 +0000</pubDate>
		<dc:creator>sgoliver</dc:creator>
				<category><![CDATA[Móviles]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[código]]></category>
		<category><![CDATA[estructura]]></category>
		<category><![CDATA[proyecto]]></category>
		<category><![CDATA[recursos]]></category>

		<guid isPermaLink="false">http://www.sgoliver.net/blog/?p=1278</guid>
		<description><![CDATA[Para empezar a comprender cómo se construye una aplicación Android vamos a echar un vistazo a la estructura general de un proyecto tipo. Cuando creamos un nuevo proyecto Android en Eclipse se genera automáticamente la estructura de carpetas necesaria para poder generar posteriormente la aplicación. Esta estructura será común a cualquier aplicación, independientemente de su [...]]]></description>
			<content:encoded><![CDATA[<p>Para empezar a comprender cómo se construye una aplicación Android vamos a echar un vistazo a la estructura general de un proyecto tipo.</p>
<p>Cuando creamos un nuevo proyecto Android en Eclipse se genera automáticamente la estructura de carpetas necesaria para poder generar posteriormente la aplicación. Esta estructura será común a cualquier aplicación, independientemente de su tamaño y complejidad.</p>
<p>En la siguiente imagen vemos los elementos creados inicialmente para un nuevo proyecto Android:</p>
<p><a href="http://www.sgoliver.net/blog/wp-content/uploads/2010/08/estruct-proyecto.png"><img class="alignnone size-full wp-image-1279" title="Estructura General Proyecto Android" src="http://www.sgoliver.net/blog/wp-content/uploads/2010/08/estruct-proyecto.png" alt="Estructura General Proyecto Android" width="193" height="136" /></a></p>
<p>Describamos los elementos principales.</p>
<p><span style="text-decoration: underline;"><strong>Carpeta /src/</strong></span></p>
<p>Contiene todo el código fuente de la aplicación, código de la interfaz gráfica, clases auxiliares, etc. Inicialmente, Eclipse creará por nosotros el código básico de la pantalla (<em>Activity</em>) principal de la aplicación, siempre bajo la estructura del paquete java definido.</p>
<p><a href="http://www.sgoliver.net/blog/wp-content/uploads/2010/08/estruct-proyecto-src.png"><img class="alignnone size-full wp-image-1284" title="Estructura Proyecto Android Carpeta SRC" src="http://www.sgoliver.net/blog/wp-content/uploads/2010/08/estruct-proyecto-src.png" alt="Estructura Proyecto Android Carpeta SRC" width="166" height="67" /></a></p>
<p><span style="text-decoration: underline;"><strong>Carpeta /res/ </strong></span></p>
<p>Contiente todos los ficheros de recursos necesarios para el proyecto: imágenes, vídeos, cadenas de texto, etc. Los diferentes tipos de recursos de deberán distribuir entre las siguientes carpetas:</p>
<ul>
<li><span style="font-family: courier new,courier;">/res/drawable/</span>. Contienen las imágenes de la aplicación. Se puede dividir en <span style="font-family: courier new,courier;">/drawable-ldpi</span>, <span style="font-family: courier new,courier;">/drawable-mdpi</span> y /<span style="font-family: courier new,courier;">drawable-hdpi</span> para utilizar diferentes recursos dependiendo de la resolución del dispositivo.</li>
<li><span style="font-family: courier new,courier;">/res/layout/</span>. Contienen los ficheros de definición de las diferentes pantallas de la interfaz gráfica. Se puede dividir en <span style="font-family: courier new,courier;">/layout</span> y <span style="font-family: courier new,courier;">/layout-land</span> para definir distintos layouts dependiendo de la orientación del dispositivo.</li>
<li><span style="font-family: courier new,courier;">/res/anim/</span>. Contiene la definición de las animaciones utilizadas por la aplicación.</li>
<li><span style="font-family: courier new,courier;">/res/menu/</span>. Contiene la definición de los menús de la aplicación.</li>
<li><span style="font-family: courier new,courier;">/res/values/</span>. Contiene otros recursos de la aplicación como por ejemplo cadenas de texto (<span style="font-family: courier new,courier;">strings.xml</span>), estilos (<span style="font-family: courier new,courier;">styles.xml</span>), colores (<span style="font-family: courier new,courier;">colors.xml</span>), etc.</li>
<li><span style="font-family: courier new,courier;">/res/xml/</span>. Contiene los ficheros XML utilizados por la aplicación.</li>
<li><span style="font-family: courier new,courier;">/res/raw/</span>. Contiene recursos adicionales, normalmente en formato distinto a XML, que no se incluyan en el resto de carpetas de recursos.</li>
</ul>
<p>Como ejemplo, para un proyecto nuevo Android, se crean los siguientes recursos para la aplicación:</p>
<p><a href="http://www.sgoliver.net/blog/wp-content/uploads/2010/08/estruct-proyecto-res.png"><img class="alignnone size-full wp-image-1285" title="Estructura Poryecto Android Carpeta RES" src="http://www.sgoliver.net/blog/wp-content/uploads/2010/08/estruct-proyecto-res.png" alt="Estructura Poryecto Android Carpeta RES" width="144" height="187" /></a></p>
<p><span style="text-decoration: underline;"><strong>Carpeta /gen/</strong></span></p>
<p>Contiene una serie de elementos de código generados automáticamente al compilar el proyecto. Cada vez que generamos nuestro proyecto, la maquinaria de compilación de Android genera por nosotros una serie de ficheros fuente en java dirigidos al control de los recursos de la aplicación.</p>
<p><a href="http://www.sgoliver.net/blog/wp-content/uploads/2010/08/estruct-proyecto-gen.png"><img class="alignnone size-full wp-image-1289" title="Estructura Proyecto Android Carpeta GEN" src="http://www.sgoliver.net/blog/wp-content/uploads/2010/08/estruct-proyecto-gen.png" alt="Estructura Proyecto Android Carpeta GEN" width="189" height="202" /></a></p>
<p>El más importante es el que se puede observar en la imagen, el fichero <span style="font-family: courier new,courier;">R.java</span>, y la clase <span style="font-family: courier new,courier;">R</span>.</p>
<p>Esta clase <span style="font-family: courier new,courier;">R</span> contendrá en todo momento una serie de constantes con los ID de todos los recursos de la aplicación incluidos en la carpeta <span style="font-family: courier new,courier;">/res/</span>, de forma que podamos acceder facilmente a estos recursos desde nuestro código a traves de este dato. Así, por ejemplo, la constante <span style="font-family: courier new,courier;">R.drawable.icon</span> contendrá el ID de la imagen <span style="font-family: courier new,courier;">&#8220;icon.png&#8221;</span> contenida en la carpeta <span style="font-family: courier new,courier;">/res/drawable/</span>. Veamos como ejemplo la clase R creada por defecto para un proyecto nuevo:</p>
<pre class="syntax-highlight:java">
package net.sgoliver;

public final class R {
    public static final class attr {
    }
    public static final class drawable {
        public static final int icon=0x7f020000;
    }
    public static final class layout {
        public static final int main=0x7f030000;
    }
    public static final class string {
        public static final int app_name=0x7f040001;
        public static final int hello=0x7f040000;
    }
}
</pre>
<p><span style="text-decoration: underline;"><strong>Carpeta /assets/</strong></span></p>
<p>Contiene todos los demás ficheros auxiliares necesarios para la aplicación (y que se incluirán en su propio paquete), como por ejemplo ficheros de configuración, de datos, etc.</p>
<p>La diferencia entre los recursos incluidos en la carpeta <span style="font-family: courier new,courier;">/res/raw/</span> y los incluidos en la carpeta <span style="font-family: courier new,courier;">/assets/</span> es que para los primeros se generará un ID en la clase <span style="font-family: courier new,courier;">R</span> y se deberá acceder a ellos con los diferentes métodos de acceso a recursos. Para los segundos sin embargo no se generarán ID y se podrá acceder a ellos por su ruta como a cualquier otro fichero del sistema. Usaremos uno u otro según las necesidades de nuestra aplicación.</p>
<p><span style="text-decoration: underline;"><strong>Fichero AndroidManifest.xml</strong></span></p>
<p>Contiene la definición en XML de los aspectos principales de la aplicación, como por ejemplo su identificación (nombre, versión, icono, &#8230;), sus componentes (pantallas, mensajes, &#8230;), o los permisos necesarios para su ejecución. Veremos más adelante más detalles de este fichero.</p>
<p>En el <a title="Componentes de una aplicación Android" href="http://www.sgoliver.net/blog/?p=1295" target="_self">siguiente post</a> veremos los componentes software principales con los que podemos construir una aplicación Android.</p>
<h3  class="related_post_title">Entradas relacionadas</h3><ul class="related_post"><li><a href="http://www.sgoliver.net/blog/?p=1414" title="Interfaz de usuario en Android: Controles de selección (II)">Interfaz de usuario en Android: Controles de selección (II)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1404" title="Interfaz de usuario en Android: Controles de selección (I)">Interfaz de usuario en Android: Controles de selección (I)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1387" title="Interfaz de usuario en Android: Controles básicos (III)">Interfaz de usuario en Android: Controles básicos (III)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1373" title="Interfaz de usuario en Android: Controles básicos (II)">Interfaz de usuario en Android: Controles básicos (II)</a></li><li><a href="http://www.sgoliver.net/blog/?p=1363" title="Interfaz de usuario en Android: Controles básicos (I)">Interfaz de usuario en Android: Controles básicos (I)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.sgoliver.net/blog/?feed=rss2&amp;p=1278</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
