Conceptos básicos de interfaces gráficas con Android
En esta entrada vamos a introducirnos en el desarrollo de interfaces gráficas para Android. Haremos un sencillo ejemplo paso a paso en donde la idea es que comprenda la filosofía con la que se trabaja al usar widgets y actividades. El resultado será una aplicación sencilla que pide una cadena de texto al usuario y la invierte. Es importante que ya tengas configurado el SDK y el Eclipse como se explica en Introducción a la programación con Android; aprenderemos a usar labels, cajas de texto, botones y eventos
Puesto que es la primera entrada de este tipo, voy a explicar detalladamente cada paso. En las siguientes iré un poco más rápido. Así que, si ya tiene experiencia con Android tal vez se aburra un poco
0. Crear un nuevo proyecto
Abrimos Eclipse y creamos un nuevo proyecto para Android:

Configuramos el proyecto de tal manera que quede así:

En este caso estoy usando la versión 1.6 de Android, pero puede escoger la versión que concuerde con el dispositivo sobre el que desea probar la aplicación. Esto se explica con más detalle en Introducción a la programación con Android. Fíjese que no hemos creado ninguna actividad inicialmente (el checkbox Create Activity no está seleccionado); la idea es ver cómo se deben crear las actividades, los layouts con la interfaz gráfica, las clases que referencian a las actividades y la configuración del AndroidManifest.xml.
1. Crear y configurar una Actividad inicial
Creamos una clase dentro del paquete net.casidiablo.ejemplo:

Y en el asistente de creación de clases de Eclipse le damos como nombre EjemploInvertir. Clic en Finish y editamos la clase para que luzca así:
package net.casidiablo.ejemplo;
import android.app.Activity;
import android.os.Bundle;
public class EjemploInvertir extends Activity{
@Override
public void onCreate(Bundle b){
super.onCreate(b);
setContentView(R.layout.main);
}
}
Lo que hemos hecho es extender la clase Activity y redefinir el método onCreate. Además, ejecutamos el método setContentView indicándole que usaremos el layout main.xml (Si tiene esta expresión en el rostro:
es que no ha leído la entrada de introducción Android).
Puesto que deseamos que esta actividad sea mostrada al momento de ejecutar la aplicación, debemos editar el archivo AndroidManifest.xml, que se encuentra en la raíz del proyecto. Al hacer doble clic sobre este, vemos que es posible editarlo usando una interfaz gráfica. Para añadir la actividad que acabamos de crear, hacemos clic en la pestaña inferior Application, y en la sección Application Nodes hacemos clic en Add… Allí seleccionamos Activity y hacemos clic en OK.

Ahora debemos configurar la actividad. En la parte derecha ha aparecido un formulario llamado Attributes for Activity, en donde podremos hacerlo. Lo más importante es el nombre de la actividad, el cual debe ser el nombre de la clase que acabamos de crear. Es posible usar el botón Browse… para buscar las actividades actualmente disponibles…

Una vez hayamos seleccionado o escrito el nombre de la clase, debemos añadirle un Intent; pero… ¿qué es un Intent
? Los componentes de una aplicación en Android se comunican a través de mensajes llamados Intents (objetos de la clase android.content.Intent). Se trata de una estructura de datos pasiva que contiene una descripción abstracta de una operación que será realizada, y se usa comúnmente para iniciar actividades
Sí ya se, es algo confuso al principio, pero de momento no es demasiado importante (más información aquí). Para añadir el intent, seleccionamos la actividad que acabamos de crear y hacemos clic en el botón Add… Seleccionamos Intent Filter, hacemos clic en OK. Y ahora, dentro del Intent crearemos dos componentes un Action y un Category.
Un Action es un String que contiene el nombre de la acción a ser realizada. En este caso, el Action será android.intent.action.MAIN, el cual es usado para ejecutar la primera actividad de una aplicación. Entonces, seleccionamos el Intent Filter que acabamos de crear, y hacemos clic en Add… escogemos Action, clic en OK y escogemos el nombre del Action:

Category es un String que contiene información adicional acerca del tipo de componente que debería manipular el Intent. En este caso el Category que añadiremos será CATEGORY_LAUNCHER el cual indica que la actividad puede ser la principal (la que se ejecuta al iniciar la aplicación). Luego de añadir el Category veremos que queda así:

Hacemos clic en el icono de guardar en la barra de herramientas y listo
También es posible editar el archivo AndroidManifest.xml a mano, lo cual pienso que es mucho más rápido. Pero no esta de más saber cómo hacerlo con la interfaz gráfica
Si abrimos el archivo con el editor de XML veremos:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.casidiablo.ejemplo" android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name="EjemploInvertir">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"></category>
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="4" />
</manifest>
Ahora que hemos configurado el AndroidManifest.xml podemos hacer una prueba de ejecución del programa… si todo va bien veremos algo como esto:

2. Crear la interfaz gráfica
En este paso, crearemos una nueva interfaz gráfica que contendrá un label, una caja de texto y un botón. Aprenderemos a posicionar/agrupar los elementos en la pantalla, y darles un tamaño adecuado. Vamos a crear un nuevo layout dentro del directorio res/layout/ (aunque podríamos haber usado el main.xml generado por asistente de Eclipse, pero prefiero que aprenda este proceso de una vez). Así que, hacemos clic en el botón de creación de nuevos archivos XML de Android:

Seleccionamos la opción layout y le damos un nombre al archivo. Por ejemplo, interfaz_grafica.xml:

¡Hacemos clic en Finish y listo! Al hacer doble clic sobre el archivo que acabamos de crear vemos que es posible editarlo usando una interfaz gráfica, pero en este caso usaremos el editor de XML, ya que es mucho más rápido hacerlo así
Hacemos clic en la pestaña inferior que tiene el nombre del archivo (interfaz_grafica.xml) y veremos algo como esto:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> </LinearLayout>
Por defecto se crea un objeto LinearLayout que contiene contiene tres parámetros: un XML Name Space (en este caso http://schemas.android.com/apk/res/android), el tamaño que ocupará a lo ancho y el que ocupará a lo largo. Para estos dos ultimos parámetros se está usando wrap_content indicando que se debe usar el menor espacio posible. Los objetos LinearLayout funcionan de manera similar a los JPanel de Java, pudiendo “contener” widgets de Android (labels, botones, menus u otros LinearLayout, etc.).
Lo siguiente será crear la interfaz gráfica para nuestro programa de ejemplo, pero antes vamos a aprender un poco sobre el directorio res/values
Por defecto veremos que hay un archivo llamado strings.xml que contiene pares nomber<=>valor. Este archivo es usado para almacenar todas las variables “estáticas” de la aplicación. Si bien su uso no es estrictamente obligatorio, si es recomendado y es bueno saber usarlo. Para nuestro ejemplo entonces, tenemos dos cadenas de texto que podrían ser estáticas: el texto que aparecerá en el label y el texto que aparecerá en el botón. Para la primera vamos a asignar el texto directamente en el XML de la interfaz gráfica, mientras que para el botón lo haremos usando el archivo strings.xml; lo hago de las dos maneras con el fin de que quede clara la diferencia entre ambos métodos.
Abrimos el archivo strings.xml, que se encuentra en el directorio res/values, para añadir una nueva cadena de texto que será usada por el botón de la aplicación. Solo debemos añadir algo como esto: <string name=”texto_boton”>Invertir!</string>, de tal manera que quede así:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World!</string>
<string name="app_name">Ejemplo</string>
<string name="texto_boton">Invertir!</string>
</resources>
Ahora sí, vamos a modificar el archivo interfaz_grafica.xml de tal manera que quede así:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical">
<LinearLayout android:orientation="horizontal"
android:layout_width="fill_parent" android:layout_height="wrap_content">
<TextView android:text="Palabra: " android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<EditText android:id="@+id/cajaTexto" android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<Button android="@+id/btnInvertir" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="@string/texto_boton"/>
</LinearLayout>
Veamos qué hemos hecho arriba:
- En la línea 3 podemos ver que cambiamos el ancho y alto del
LinearLayoutprincipal de tal manera que utilice toda la pantalla (usandofill_parent). - Puesto que el
LinearLayoutcontendrá otros objetos, debemos indicarle el sentido en el que los irá poniendo. En este caso se deben poner verticalmente (android:orientation="vertical"). - En las líneas 5 y 6 creamos un nuevo
LinearLayoutque contendrá el label y la caja de texto. Puesto que queremos que estos dos objetos aparezcan en una sola línea, ponemos el parámetroandroid:orientation="horizontal". Además, le indicamos que ocupe toda la pantalla a lo ancho, pero que la altura sea la más pequeña posible. - En las líneas 7 y 8 creamos un nuevo
TextView(un label) con el texto “Palabra: “; esto lo indicamos con la propiedadandroid:text. Además queremos que ocupe el menor espacio posible tanto en alto como en ancho (wrap_contentparalayout_widthylayout_height). - En las líneas 9 y 10 creamos un
EditText(una caja de texto), que es donde el usuario pondrá la palabra que desea invertir. Intentará ocupar el mayor ancho posible en la pantalla. Además, puesto que este es un objeto del cual necesitaremos datos, debemos asignarle un ID para que podamos acceder a él desde el programa en Java que crearemos en breve. - En la línea 11 cerramos el
LinearLayoutque contiene el label y la caja de texto. - En las líneas 12 y 13 creamos un objeto
Button. Este objeto también tiene un ID puesto que debemos obtener una referencia del mismo desde el programa en Java. Además, a la propiedadandroid:textse está asignando@string/texto_botonque es la referencia a la variable que creamos en elstrings.xml
Ahora que hemos creado la interfaz gráfica, vamos a ejecutar la aplicación para ver si ha quedado bien. Pero antes, debemos indicarle a nuestra Actividad que el layout que debe ejecutar es interfaz_grafica.xml. Esto lo hacemos modificando la clase EjemploInvertir.java para que quede así:
package net.casidiablo.ejemplo;
import android.app.Activity;
import android.os.Bundle;
public class EjemploInvertir extends Activity{
@Override
public void onCreate(Bundle b){
super.onCreate(b);
setContentView(R.layout.interfaz_grafica);
}
}
Si todo va bien, al ejecutar la aplicación veremos algo como esto:

3. Programación de objetos de la interfaz gráfica
Ahora que hemos construido la interfaz gráfica, debemos programar la parte de “invertir la cadena de texto”. Para ello necesitamos extraer el texto que se ponga en la caja de texto y manejar los eventos que genera el botón; en cualquier caso, necesitamos referencias a dichos objetos. Así que, de momento, vamos a hacer que nuestra clase EjemploInvertir.java luzca así:
package net.casidiablo.ejemplo;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
public class EjemploInvertir extends Activity{
//declarar objetos
private EditText texto;
private Button boton;
@Override
public void onCreate(Bundle b){
super.onCreate(b);
setContentView(R.layout.interfaz_grafica);
//iniciar los objetos
texto = (EditText) findViewById(R.id.cajaTexto);
boton = (Button) findViewById(R.id.btnInvertir);
}
}
Veamos qué ha pasado allá arriba
- En las líneas 4 y 5 importamos las clases
ButtonyEditTextdel paqueteandroid.widget. - En las líneas 9 y 10 declaramos objetos de tipo
EditTextyButton, los cuales los usaremos para manipular los que hemos creado en la interfaz gráfica. - En la líneas 17 iniciamos el objeto
EditTextousando el métodofindViewById, a la cual le enviamos como parámetro el ID de la caja de texto (¿recuerdas? pusimos esto dentro del XML:android:id="@+id/cajaTexto"). - De igual manera creamos el objeto botón usando el ID
btnInvertirque definimos en el XML.
Hasta el momento solo hemos creado los objetos, pero no estamos haciendo nada con ellos. Para esto, vamos a asignar un listener al botón, que ejecutará ciertas acciones al momento de presionarlo. Esto lo hacemos con el método setOnClickListener el cual recibe como parámetro un objeto de tipo android.view.View.OnClickListener. Veamos cómo debe quedar la clase y luego explico cada componente nuevo:
package net.casidiablo.ejemplo;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class EjemploInvertir extends Activity{
//declarar objetos
private EditText cajaDeTexto;
private Button boton;
@Override
public void onCreate(Bundle b){
super.onCreate(b);
setContentView(R.layout.interfaz_grafica);
//iniciar los objetos
cajaDeTexto = (EditText) findViewById(R.id.cajaTexto);
boton = (Button) findViewById(R.id.btnInvertir);
boton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
invertir();
}
});
}
//metodo para invertir el texto
private void invertir(){
//obtener el string de la caja de texto
String txt = cajaDeTexto.getText().toString();
//verificar que haya texto por invertir
if(!txt.equals("")){
//invertir texto
String resultado = "";
for (int i = txt.length()-1; i>=0; i--)
resultado += txt.charAt (i);
//asignamos el string invertido a la caja de texto
cajaDeTexto.setText(resultado);
}
else Toast.makeText(this, "No hay nada que invertir", Toast.LENGTH_LONG).show();
}
}
Veamos que fue todo eso…
- En la línea 5 se importan la interfaz
OnClickListener. Dicha interfaz es usada en la línea 20 al crear un objeto que se enviará como parámetro al métodosetOnClickListener. Dentro, es necesario implementar el métodoonClicken donde pondremos las instrucciones que serán ejecutadas al momento de hacer clic en el botón (en este caso una llamada a la funcióninvertir(), líneas 28 a 41). - El método invertir inicia una variable
Stringcon los datos que contenga la caja de texto, usando el métodogetTextde la claseEditText. - En las líneas 35 y 36 se invierte la cadena, que posteriormente se pone de nuevo en la caja de texto usando el método
setText(línea 38). - En la línea 40 mostramos un mensaje usando la clase
Toast. Este mensaje aparece cuando no hay datos en la caja de texto. Lo he colocado puesto que es bastante sencillo de implementar. Basta con usar el método estáticomakeTextpasándole como parámetros el contexto en el que se mostrará (se usathis, puesto que se mostrará en la Actividad actual), el texto a mostrar y cuanto tiempo durará el mensaje.
Al ejecutar la aplicación, escribir “Estoy invertido” en la caja de texto y presionar el botón, veremos algo así:

Si no ponemos texto y presionamos el botón Invertir, veremos:

La aplicación está lista para ser probada en un dispositivo real. En mi caso la instalé en una HTC Tattoo y se ve así:

4. Descargar código
Este es el código fuente usado para este tutorial, espero le haya gustado. Cualquier duda o sugerencia no dude en comentarla.
71 Comentarios | deja el tuyo





muy buen tutorial! muy claro!
muchas cosas que necesitaba las solucione metiendo mano, como todos creeria, y con la ayuda de la documentacion…..
pero como NO dejo de ser un novato….ahora vienen las preguntas!
1ro. como hacer para la navegacion entre pantallas y que se pasen informacion entre ellas..
2do. para consumir un webservice el cual me da una lista de lo que fuera, previamente lo tengo que parsear a un .xml de android y guardarlo en RES?……de ser asi, necesitaria el schema de xml de android?…. o bien, que el webservice directamente me lo de en el formato necesario,de igual forma necesitaria el schema….
Hola Mariano:
Para pasar información entre actividades se deben usar los extras. Son datos que viajan dentro del intent que ejecuta la actividad. Entonces, antes de ejecutar el
startActivity, le pasas los datos al intent usando:intent.putExtra("nombre", "valor");. En la actividad que es ejecutada, puedes leer esos datos usando:Bundle bundle = getIntent().getExtras();String var = bundle.getString("variable");
Con respecto a lo segundo, te doy mi consejo: usa recursos JSON en vez de XML; Android viene con librerías para parsing the JSON, y es un formato mucho menos estricto y fácil de manejar.
Un saludo!
Hola, muy bueno tu tutorial.
me podrías decir como crear textview desde código, es que estoy haciendo un juego de ahorcado y tengo que crear textview de acuerdo a la longitud de la palabra, para esto tengo que saber crearlo desde código
De antemano, muchas gracias.
Es sencillo… solo tienes que pasar un context al constructor:
TextView ttt = new TextView(unContext);El context puede ser la actividad en sí. Y luego lo añades al contenedor:
contenedor.addView(ttt);El contenedor puede ser un LinearLayout, RelativeLayout, o cualquier otra clase que extienda ViewGroup. Para lo del tamaño, se lo puedes asignar al momento de añadirlo:
contenedor.addView(ttt, new LayoutParams(anchura, altura));Un millón de gracias, de verdad, algo tan simple no lo podía hacer. nuevamente muchas gracias.
ahora tengo otra pregunta, como puedo hacer para crear cantidad de TextView dentro de un lazo.
yo se esto es mas programación orientada a objetos propiamente dicho pero no se como.
de nuevo muchas gracias y perdon por molestarte tanto
hola necesito alluda he usado este tutorial y he seguido paso a paso lo que devo hacer es la primera ves que uso android y no me funciona simplemente no va lo he intentado todo el momento del error que tengo es al definir la funcion de onClickListener en la clase. si alguien tiene algo que comentarme no dude en hacerlo gracias
A mi tambien me da error en el ” public void onClick(View v) { ” y no se porque es, si pudieras darnos algo de luz…
Gracias de antemano
Hola, yo también he tenido el mismo error y después de horas buscando por fin he dado con la clave. El problema está en que la etiqueta del botón está mal escrita y entonces no sabe devolver el objeto que contiene ese id y por eso retorna un null la función findViewById(..).
Para solucionarlo basta con poner en la declaración del botón lo siguiente:
android:id=”@+id/btnInvertir”
el :id es lo que falta y por eso da el error
Vaya, yo solo estuve dandole vueltas al progrma principal!!! no se me ocurrio mirar el resto, gracias tio!!
Porcierto si conoces algun sitio donde hayan mas ejemplos ampliando mas cosas se agradeceria el enlace ^^
Gracias, también buscaba eso
Erees un makina tiio me kitaste me regalaste un par de horas de mi vida jejejeje Un saludo a todos y seguid asii !!! Esto si es un tutorial de verdad y bien explicado. Mis gratificaciones a todos los que pusieron su granito de arena
Hola muy buen tutorial, pero tengo una duda creo una actividad principal la cual tiene un menu hecho por mi el cual son label y iconos, como puedo hacer que con el onclick me pase a otra actividad.
Gracias:D
Buen dia, como puedo ejecutar la aplicacion en el movil si se trabajo en windows?
gracias.
Necesitas poner tu móvil en modo depuración, luego lo conectas por USB y dentro de Eclipse, vas a Run Configuration y dentro de la pestaña Target le das a Manual. Cuando le des a ejecutar podrás elegir si lo ejecutas en tu terminal o en el emulador, es sencillo.
PD: Muy buenos tutoriales amigo, sobre todo para la gente que se está iniciando, un saludo
Hola que tal, primero, esta muy bueno el ejemplo, solo tengo una duda, si tengo dos ventanas, con dos Activivity, como puedo llamar de una ventana a la otra? Como le asigno la segunda activity al segundo..No entiendo muy bien….
Gracias..!!
Umm… ¿podrías explicarte un poco mejor? No entiendo bien qué es lo que necesitas
Ok, la cosa es que yo tengo un menu principal, eso es mi primer activity y mi primer interfaz, la que me crea por defecto el eclipse, luego quiero otra ventana que la llamo desde el menú, pero no se como hacerlo, tengo una idea que es “crear la segunda actividad, y la segunda clase activity para esta, llamarla desde el menu.” Pero al crear la segunda interfaz no se como vincularla con el segundo activity. No lo he hecho en el mainfiest(xq no lo entiendo bien), creo q ahi está el detalle.
Ahh OK… básicamente tienes que:
1. Añadir la actividad a tu manifest:
2. Luego creas una clase con ese nombre (en este caso NombreActivity).
Luego, desde tu primera actividad:
Intent intent = new Intent(PrimeraActividad.this, NombreActividad.class);startActivity(intent);
Y ya.
Gracias Cristian, con lo que me dijiste pude hacerlo… mi problema era que tenia que agregar el segundo layout a la segunda actividad creada, yo colocaba en la segunda actividad:
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
sin embargo era:
super.onCreate(savedInstanceState);
setContentView(R.layout.clientes);
//Clientes(segundo layout)…
despues con el codio q me das, lito, funciona perfecto.
me marca error en
boton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
invertir();
}
});
en la linea ” public void onClick(View v) { ”
hasta que elimino el @Override que esta en la linea anterior. pero si lo elimino no corre bien . ayuda por favor.!
Supongo que importaste mal la interfaz OnClickListener… verifica que hayas importado la que pertenece a la clase View y no a la que pertenece a DialogInterface.
Hola, yo tengo el mismo problema comprobé los imports y estan bien.
saludos amigo tengo una consulta, al compilar el codigo de este ejemplo en netbeans me sale un error que dice:
Sorry: The application Ejemplo(process interfaz.Android) has stopped unexpectedly. Please try again.
Y debajo la opcion FORCE CLOSE.
A que crees que se deba esto?
Saludos.
Saludos a todos, espero que alguien me pueda aclarar esta duda que tengo
porque cuando se crear este objeto
boton = (Button) findViewById(R.id.btnInvertir);
no se utiliza el comando new Button como se suelen crear los objetos en java?
Se usa findViewById cuando la UI de la actividad fue creada desde el XML; esto es así porque al definir la UI en el XML, Android crea los Widgets por uno (es decir, es Android quien hace el
new Button), y por lo tanto lo que hacemos es obtener una referencia a ese objeto ya creado (en vez de crear uno nuevo). Por otro lado, es posible crear UIs sin usar XML, en cuyo caso es obligatorio usarnew.Hola a todos,
¿Se puede utilizar un ListView en una Activity o tiene que ser en una ListActivity?
Un saludo,
Sí se puede usar sin necesidad de que sea una ListActivity.
Holaaa mmm muy buen tutorial proo quizas podrias subir unoo referente a como hacer una agenda en android con C o C++ muchas gracias!!! :3 cualquier cosaa un ejemplo al mail
Buen tutorial, gracias
Excelente ejemplo, gracias ha servido para dar nuestro primer paso en desarrollos para Android