Desarrollando una aplicación Android sencilla

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 capítulo el clásico Hola Mundo 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 Hola Mundo transformándolo en algo así como un Hola Usuario, 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. Así de sencillo e inútil, pero aprenderemos muchos conceptos básicos, que para empezar no está mal.

Por dibujarlo para entender mejor lo que queremos conseguir, sería algo tan sencillo como lo siguiente:

aplicacion-sencilla_opt

Vamos a partir del proyecto de ejemplo que creamos en un apartado anterior, al que casualmente llamamos HolaUsuario.

Como ya vimos Eclipse había creado por nosotros la estructura de carpetas del proyecto y todos los ficheros necesarios de un Hola Mundo básico, es decir, una sola pantalla donde se muestra únicamente un mensaje fijo.

Lo primero que vamos a hacer es diseñar nuestra pantalla principal modificando la que Eclipse nos ha creado por defecto. Aunque ya lo hemos comentado de pasada, recordemos 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 están separados en dos ficheros distintos. Por un lado, en el fichero  /res/layout/activity_main.xml tendremos el diseño puramente visual de la pantalla definido como fichero XML y por otro lado, en el fichero  /src/paquete.java/MainActivity.java, encontraremos el código java que determina la lógica de la pantalla.

Vamos a modificar en primer lugar el aspecto de la ventana principal de la aplicación añadiendo los controles (views) que vemos en el esquema mostrado al principio del apartado. Para ello, vamos a sustituir el contenido del fichero activity_main.xml por el siguiente:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/LblNombre"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/nombre" />

    <EditText
        android:id="@+id/TxtNombre"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="text">
    </EditText>

    <Button
        android:id="@+id/BtnHola"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hola" />

</LinearLayout>

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 por ahora en cada detalle, pero expliquemos un poco lo que vemos en el fichero.

Lo primero que nos encontramos es un elemento LinearLayout. Los layout 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 Swing, conocerán este concepto perfectamente. En este caso, un LinearLayout distribuirá los controles simplemente uno tras otro y en la orientación que indique su propiedad android:orientation, que en este caso será “vertical”.

Dentro del layout hemos incluido 3 controles: una etiqueta (TextView), un cuadro de texto (EditText), y un botón (Button). En todos ellos hemos establecido las siguientes propiedades:

  • android:id. ID del control, con el que podremos identificarlo más tarde en nuestro código. Vemos que el identificador lo escribimos precedido de “@+id/”. Esto tendrá como efecto que al compilarse el proyecto se genere automáticamente una nueva constante en la clase R para dicho control. Así, por ejemplo, como al cuadro de texto le hemos asignado el ID TxtNombre, podremos más tarde acceder al él desde nuestro código haciendo referencia a la constante R.id.TxtNombre.
  • android:layout_height y android:layout_width. Dimensiones del control con respecto al layout que lo contiene. Esta propiedad tomará normalmente los valores “wrap_content” para indicar que las dimensiones del control se ajustarán al contenido del mismo, o bien “match_parent” para indicar que el ancho o el alto del control se ajustará al ancho o alto del layout contenedor respectivamente.

Además de estas propiedades comunes a casi todos los controles que utilizaremos, en el cuadro de texto hemos establecido también la propiedad android:inputType, que indica qué tipo de contenido va a albergar el control, en este caso texto normal (valor “text”), aunque podría haber sido una contraseña (textPassword), un teléfono (phone), una fecha (date), ….

Por último, en la etiqueta y el botón hemos establecido la propiedad android:text, que indica el texto que aparece en el control. Y aquí nos vamos a detener un poco, ya que tenemos dos alternativas a la hora de hacer esto. En Android, el texto de un control se puede especificar directamente como valor de la propiedad android:text, o bien utilizar alguna de las cadenas de texto definidas en los recursos del proyecto (como ya vimos, en el fichero strings.xml), en cuyo caso indicaremos como valor de la propiedad android:text su identificador precedido del prefijo “@string/”. Dicho de otra forma, la primera alternativa habría sido indicar directamente el texto como valor de la propiedad, por ejemplo en la etiqueta de esta forma:

<TextView
        android:id="@+id/LblNombre"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Escribre tu nombre:" />

Y la segunda alternativa, la utilizada en el ejemplo, consistiría en definir primero una nueva cadena de texto en el fichero de recursos /res/values/strings.xml, por ejemplo con identificador “nombre” y valor “Escribe tu nombre:”.

<resources>

    . . .

    <string name="nombre">Escribe tu nombre:</string>

    . . .

</resources>

Y posteriormente indicar el identificador de la cadena como valor de la propiedad android:text, siempre precedido del prefijo “@string/”, de la siguiente forma:

<TextView
        android:id="@+id/LblNombre"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/nombre" />

Esta segunda alternativa nos permite tener perfectamente localizadas y agrupadas todas las cadenas de texto utilizadas en la aplicación, lo que nos podría facilitar por ejemplo la traducción de la aplicación a otro idioma.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 activity_saludo.xml, y añadiendo esta vez tan solo una etiqueta (TextView) para mostrar el mensaje personalizado al usuario.

Para añadir el fichero, pulsaremos el botón derecho del ratón sobre la carpeta de recursos /res/layout y pulsaremos la opción “New Android XML file”.

new-android-xml-file_opt

En el cuadro de diálogo que nos aparece indicaremos como tipo de recurso “Layout”, indicaremos el nombre del fichero (con extensión “.xml”) y como elemento raíz seleccionaremos LinearLayout. Finalmente pulsamos Finish para crear el fichero.

new-android-xml-file-2_opt

Eclipse creará entonces el nuevo fichero y lo abrirá en el editor gráfico, aunque como ya indicamos, nosotros accederemos a la solapa de código para modificar directamente el contenido XML del fichero.

Para esta segunda pantalla el código que incluiríamos sería el siguiente:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/TxtSaludo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="" />

</LinearLayout>

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 MainActivity.java. Empecemos por comentar su código por defecto:

package net.sgoliver.android.holausuario;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

Como ya vimos en un apartado anterior, las diferentes pantallas de una aplicación Android se definen mediante objetos de tipo Activity. Por tanto, lo primero que encontramos en nuestro fichero java es la definición de una nueva clase MainActivity que extiende a Activity. El único método que modificaremos de esta clase será el método onCreate(), 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 setContentView(R.layout.activity_main). Con esta llamada estaremos indicando a Android que debe establecer como interfaz gráfica de esta actividad la definida en el recurso R.layout.activity_main, que no es más que la que hemos especificado en el fichero /res/layout/activity_main.xml. Una vez más vemos la utilidad de las diferentes constantes de recursos creadas automáticamente en la clase R al compilar el proyecto.

Además del método onCreate(), vemos que también se sobrescribe el método onCreateOptionsMenu(), que se utiliza para definir menús en la aplicación. Por el momento no tocaremos este método, más adelante en el curso nos ocuparemos de este tema.

Ahora 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 FrmSaludo que extienda también de Activity y que implemente el método onCreate() pero indicando esta vez que utilice la interfaz definida para la segunda pantalla en R.layout.activity_saludo.

Para ello, pulsaremos el botón derecho sobre la carpeta /src/tu.paquete.java/ y seleccionaremos la opción de menú New / Class.

new-class-1_opt

En el cuadro de diálogo que nos aparece indicaremos el nombre (Name) de la nueva clase y su clase padre (Superclass) como android.app.Activity.

new-class-2_opt

Pulsaremos Finish y Eclipse creará el nuevo fichero y lo abrirá en el editor de código java.

Modificaremos por ahora el código de la clase para que quede algo análogo a la actividad principal:

package net.sgoliver.android.holausuario;

import android.app.Activity;
import android.os.Bundle;

public class FrmSaludo extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_saludo);
       }
}

NOTA: Todos los pasos anteriores de creación de una nueva pantalla (layout xml + clase java) se puede realizar también mediante un asistente de Eclipse al que se accede mediante el menú contextual “New / Other… / Android / Android Activity”. Sin embargo, he preferido explicarlo de esta forma para que quedaran claros todos los pasos y elementos necesarios.

Sigamos. Por ahora, el código incluido 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 MainActivity, 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 findViewById() indicando el ID de cada control, definidos como siempre en la clase R. Todo esto lo haremos dentro del método onCreate() de la clase MainActivity, justo a continuación de la llamada a setContentView() que ya comentamos:

. . .

import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

. . .

public class MainActivity extends Activity {

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

        //Obtenemos una referencia a los controles de la interfaz
        final EditText txtNombre = (EditText)findViewById(R.id.TxtNombre);
        final Button btnHola = (Button)findViewById(R.id.BtnHola);

        . . .

    }
}

. . .

Como vemos, hemos añadido también varios import adicionales para tener acceso a todas las clases utilizadas.

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, continuando el código anterior, y siempre dentro del método onCreate(), implementaremos el evento onClick de dicho botón, veamos cómo:

. . .

import android.content.Intent;

. . .

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {

        . . .

        //Obtenemos una referencia a los controles de la interfaz
        final EditText txtNombre = (EditText)findViewById(R.id.TxtNombre);
        final Button btnHola = (Button)findViewById(R.id.BtnHola);

        //Implementamos el evento “click” del botón
        btnHola.setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View v) {
                  //Creamos el Intent
                  Intent intent =
                          new Intent(MainActivity.this, FrmSaludo.class);

                  //Creamos la información a pasar entre actividades
                  Bundle b = new Bundle();
                  b.putString("NOMBRE", txtNombre.getText().toString());

                  //Añadimos la información al intent
                  intent.putExtras(b);

                  //Iniciamos la nueva actividad
                  startActivity(intent);
             }
        });
    }

}

. . .

Como ya indicamos en el apartado anterior, la comunicación entre los distintos componentes y aplicaciones en Android se realiza mediante intents, por lo que el primer paso será crear un objeto de este tipo. Existen varias variantes del constructor de la clase Intent, cada una de ellas dirigida a unas determinadas acciones.  En nuestro caso particular vamos a utilizar el intent para llamar a una actividad desde otra actividad de la misma aplicación, para lo que pasaremos a su constructor una referencia a la propia actividad llamadora (MainActivity.this), y la clase de la actividad llamada (FrmSaludo.class).

Si quisiéramos tan sólo mostrar una nueva actividad ya tan sólo nos quedaría llamar a startActivity() pasándole como parámetro el intent creado. Pero en nuestro ejemplo queremos también pasarle cierta información a la actividad llamada, concretamente el nombre que introduzca el usuario en el cuadro de texto de la pantalla principal. Para hacer esto vamos a crear un objeto Bundle, 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 String mediante el método putString(clave, valor). Tras esto añadiremos la información al intent mediante el método putExtras(bundle).

Con esto hemos finalizado ya actividad principal de la aplicación, por lo que pasaremos ya a la secundaria. Comenzaremos de forma análoga a la anterior, ampliando el método onCreate() 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 intent que ha originado la actividad actual mediante el método getIntent() y recuperaremos su información asociada (objeto Bundle) mediante el método getExtras().

Hecho esto tan sólo nos queda construir el texto de la etiqueta mediante su método setText(texto) y recuperando el valor de nuestra clave almacenada en el objeto Bundle mediante getString(clave).

package net.sgoliver.android.holausuario;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class FrmSaludo extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_saludo);

		//Localizar los controles
             TextView txtSaludo = (TextView)findViewById(R.id.TxtSaludo);

             //Recuperamos la información pasada en el intent
             Bundle bundle = this.getIntent().getExtras();

             //Construimos el mensaje a mostrar
             txtSaludo.setText("Hola " + bundle.getString("NOMBRE"));
	}
}

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 ya indicamos en un apartado anterior, toda aplicación Android utiliza un fichero especial en formato XML (AndroidManifest.xml) 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 mediante una nueva etiqueta <Activity>, indicar el nombre de la clase java asociada como valor del atributo android:name, y asignarle su título mediante el atributo android:label, más adelante veremos que opciones adicionales podemos especificar. Todo esto lo incluiremos justo debajo de la definición de la actividad principal dentro del fichero AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="net.sgoliver.android.holausuario"
    android:versionCode="1"
    android:versionName="1.0" >

    . . .

        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".FrmSaludo"
                  android:label="@string/title_activity_saludo" >

        </activity>

    </application>

</manifest>

Como vemos, el título de la nueva actividad lo hemos indicado como referencia a una nueva cadena de caracteres, que tendremos que incluir como ya hemos comentado anteriormente  en el fichero /res/values/strings.xml

Llegados aquí, y si todo ha ido bien, deberíamos poder ejecutar el proyecto sin errores y probar nuestra aplicación en el emulador.

La forma de ejecutar y depurar la aplicación en Eclipse es análoga a cualquier otra aplicación java, pero por ser el primer capítulo vamos a recordarla.

Lo primero que tendremos que hacer será configurar un nuevo “perfil de ejecución”. Para ello accederemos al menú “Run/ Run Configurations…” y nos aparecerá la siguiente pantalla.

ejecutar-aplicacion-1_opt

Sobre la categoría “Android Application” pulsaremos el botón derecho y elegiremos la opción “New” para crear un nuevo perfil para nuestra aplicación. En la siguiente pantalla le pondremos un nombre al perfil, en nuestro ejemplo “hola-usuario”, y en la pestaña “Android” seleccionaremos el proyecto que queremos ejecutar.

ejecutar-aplicacion-2_opt

El resto de opciones las dejaremos por defecto y pasaremos a la pestaña “Target”. En esta segunda pestaña podremos seleccionar el AVD sobre el que queremos ejecutar la aplicación, aunque suele ser práctico indicarle a Eclipse que nos pregunte esto antes de cada ejecución, de forma que podamos ir alternando fácilmente de AVD sin tener que volver a configurar el perfil. Para ello seleccionaremos la opción “Always prompt to pick device”.

ejecutar-aplicacion-3_opt

Un poco más abajo en esta misma pestaña es bueno marcar la opción “Disable Boot Animation” para acelerar un poco el primer arranque del emulador, y normalmente también suele ser necesario reducir, o mejor dicho escalar, la pantalla del emulador de forma que podamos verlo completo en la pantalla de nuestro PC. Esto se configura mediante la opción “Additional Emulator Command Line Options”, donde en mi caso indicaré la opción “-scale 0.75”, aunque este valor dependerá de la resolución de vuestro monitor y de la configuración del AVD.

ejecutar-aplicacion-4_opt

Tras esto ya podríamos pulsar el botón “Run” para ejecutar la aplicación en el emulador de Android. Eclipse nos preguntará en qué dispositivo queremos ejecutar y nos mostrará dos listas. La primera de ellas con los dispositivos que haya en ese momento en funcionamiento (por ejemplo si ya teníamos un emulador funcionando) y la siguiente con el resto de AVDs configurados en nuestro entorno. Elegiré en primer lugar el emulador con Android 2.2. Es posible que la primera ejecución se demore unos minutos, todo dependerá de las posibilidades de vuestro PC, así que paciencia.

ejecutar-aplicacion-5_opt

Si todo va bien, tras una pequeña espera aparecerá el emulador de Android y se iniciará automáticamente nuestra aplicación. Podemos probar a escribir un nombre y pulsar el botón “Hola” para comprobar si el funcionamiento es el correcto.

aplicacion-22_opt

Sin cerrar este emulador podríamos volver a ejecutar la aplicación sobre Android 4.2 seleccionando el AVD correspondiente. De cualquier forma, si vuestro PC no es demasiado potente no recomiendo tener dos emuladores abiertos al mismo tiempo.

aplicacion-41_opt

Y con esto terminamos por ahora. Espero que esta aplicación de ejemplo os sea de ayuda 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, y la forma de comunicar diferentes actividades de Android. En los apartados siguientes veremos algunos de estos temas de forma mucho más específica.

Podéis consultar online y descargar el código fuente completo de este artículo desde github.

Curso de Programación Android en PDF

Este curso también está disponible en PDF. Descubre cómo conseguirlo…

¿Te ha sido de utilidad el Curso de Programación Android? ¿Quieres colaborar de forma económica con el proyecto? Puedes contribuir con cualquier cantidad, unos céntimos, unos euros, cualquier aportación será bienvenida. Además, si tu aportación es superior a una pequeña cantidad simbólica recibirás como agradecimiento un documento con la última versión del curso disponible en formato PDF. Sea como sea, muchas gracias por colaborar!

Más información:

, , , , , ,

199 Respuestas a Desarrollando una aplicación Android sencilla

  1. StanPad 08/09/2012 at 6:17 #

    Hola muy bien explicados tus tutoriales, yo en cambio tengo un problema y es que cada vez que ejecuto el proyecto; el me habre la maquina virtual de android pero no me muestra nada ya que me envia un error “could not get wglGetExtensionsStringARB”. Espero que me ayudes a solucionar dicho problema.

  2. Jose 18/09/2012 at 22:35 #

    Me pasa igual me aparese se detubo inesperadamente, cierre forsado

  3. Sergio 10/10/2012 at 12:58 #

    Ando siguiendo el tutorial usando las ultimas versiones de todo y hay varios detalles desactualizados en este articulo, los voy comentando por si Oliver se ve con ganas y le da un repaso:

    1) Cuando dices que añadamos un nuevo fichero xml, me quede un poco parado… ¿como?: En el árbol del proyecto, botón derecho sobre la zona que quieras (da igual, prueba sobre “src” por ejemplo”), “New, Other” (o Ctrl+N) y luego “Android”, y aquí tiene “Android XML Layout file”.

    2) Cuando se habla de añadir los dos “final” con las refs. a los controles, no dices donde se han de poner, me volvía loco: van dentro del OnCreate justo después del setContentView

    3) Idem. cuando añades el onClickListener, va dentro del onCreate debajo de lo anterior.

    4) Dices que se añada un código que comienza por “btnHola.setOnClickListener(new OnClickListener() {“, pero no funciona, le falta un “View.” y la versión actualizada sería: “btnHola.setOnClickListener(new View.OnClickListener() {“.

    5) Justo debajo sigues con “@override” pero el compilador me dice que sobra.

    Con esos cambios ya me compila todo!

    Oliver, como ando siguiendo el curso paso a paso, te ire “informando” de estas cosas que vaya detectando.

  4. admin 10/10/2012 at 21:27 #

    Gracias Sergio, tendré en cuenta estos detalles, sobre todo ahora que estoy actualizando todos los artículos. Saludos.

  5. andrew95434 12/10/2012 at 2:18 #

    gracias por el curso esta muy bueno. el unico problema es que creo que en este articulo te das muchas vueltas para hacer algo relativamente facil. estuve leyendo el tutorial de android en http://developer.android.com/intl/es/training/basics/firstapp/starting-activity.html y me di cuenta que hace exactamente lo mismo pero sin la necesidad de pasar de intent a bundle, sino que deja el string creado siempre como un instant, y tampoco crea un metodo raro (no se si es un metodo pero se ve como uno) en medio del metodo onCreate()

  6. Luis 12/10/2012 at 16:28 #

    Excelente articulo, me ayudo a aclarar mucho los conceptos.. Felicitaciones

  7. Miguel 12/10/2012 at 17:09 #

    Hola.
    He seguido el tutorial hasta esta pagina.
    Me parece muy interesante y está muy bien explicado, pero al llegar a esa página no puedo seguir (mejor no se siguir). En el primer codigo que hay que modificar en /res/layout/main.xml no estás. Es decir cuando voy a esa me aparece el archivo /res/layout/activity_main.xml y no hay codigo por ningun lado

    No se seguir.

    Un saludo
    Miguel

  8. John Ortiz 13/10/2012 at 17:39 #

    Excelente trabajo. Y una buena manera ‘inútil’ (como le dice su autor arriba) para introducir los conceptos básicos de la programación de aplicaciones móviles Android.

    Lo ejecuté en un Galaxy S3 y funcionó según lo especificado.

    Gracias.

  9. Pablo 18/12/2012 at 16:03 #

    Hola muchas gracias por tu tutorial, espero que me sirva de ayuda. He visto que el código que pones en el tuto es diferente al del codigo fuente que pones para descargar y despista mucho sobre todo a los noveles como yo. Aparte dejaria claro que el método btnHola.setOnClickListener y sus variables finales van exactamente dentro del oncreate.

  10. Sergio 23/12/2012 at 21:42 #

    Amigo, excelente tutorial…. solo que tengo problemas con el ultimo paso en donde modificamos el archivo androidmanifest. xml, no se si podrías publicar completo el código fuente de este fichero para verificarlo con el mio…

  11. Israel 29/12/2012 at 11:06 #

    Hola , felicidades por el tutorial ,esta muy currado , pero mesalen varios errores al editar las lineas de comando a la izquierda de la ventana del tipo “txnombre cannot be resolve or is not a field” No estoy muy ducho en programacion asi que estoy unpoco perdido.POr cierto a alguien le ha funcionado?

    Un saludo y gracias

  12. noblejis 04/01/2013 at 2:51 #

    Buenas, lo primero felicitarte por el curso.

    Tengo el mismo problema que Israel. Creo que el error viene porque no se hace un “import android.R;” en MainActivity.java y en FrmSaludo.java. Por este motivo no encuentra los controles de la interfaz.

    Aún así, a mi el error me sigue saliendo. He probado a limpiar el proyecto pero nada.

  13. oscar 06/01/2013 at 0:57 #

    Oígan alguien me podría decir por que me aparece Couldn’t resolve resource @string/nombre Couldn’t resolve resource @string/hola?

  14. oscar 06/01/2013 at 0:59 #

    se me olvidaba también me podrían decir porque me aparece this text field does not specify an input type or a hint o qué tengo que hacer?

  15. oscar 06/01/2013 at 1:27 #

    oigan ya resolvi lo que puse en el segundo comentario quisiera saber que hacer para corregir esto: NOTE: This project contains resource errors, so aapt did not succeed, which can cause rendering failures. Fix resource problems first.
    y esto: error: Error: No resource found that matches the given name (at ‘text’ with value ‘@string/hola’). y por último esto: error: Error: No resource found that matches the given name (at ‘text’ with value ‘@string/nombre’).

  16. Jose Andres 07/01/2013 at 20:25 #

    Me pasa lo mismo que a oscar, es decir en el fichero activity_main.xml
    no me reconoce android:text=”@string/nombre” /> ni el android:text=”@string/hola” />, me da el mismo error Error: No resource found that matches the given name (at ‘text’ with value ‘@string/hola’).
    Tambien me da error en MainActivity.java en las lineas:
    final EditText txtNombre = (EditText)findViewById(R.id.TxtNombre);
    final Button btnHola = (Button)findViewById(R.id.BtnHola);
    No reconoce los identificadores TxtNombre y BtnHola, he visto en el fichero fuente que éstos están definidos en el fichero R.java, pero este es un fichero autogenerado, ¿como hago para autogenerarlo?

  17. Jose Andres 07/01/2013 at 21:14 #

    Ya solucione lo anterior en el fichero strings.xml, que con las prisas no había visto la explicación, con esto parece que ya funciona

  18. camilo russi 14/01/2013 at 20:59 #

    Hola quisiera saber al compiliar el proyecto donde queda el apk, en donde puntualmente podemos escribir el nombre de la aplicacion difrente al del nombre del proyecto, verificar si podemos colocar a ese nombre caracteres en español como á,é,í,ó,ú,ñ o espacios.

  19. Camilo 15/01/2013 at 6:50 #

    Hola como estan tengo un pequeño inconveniente, ya quedo lista la aplicacion no tengo ningun error al parecer, pero al ejecutar con cualquier emulador se queda la pantalla negra o con las letras de android, pero de hay no pasa luego de un rato se cancela la aplicacion se ve que compila bien pero no se ejecuta

  20. Camilo 15/01/2013 at 6:52 #

    Disculpa se me olvido agradecer por tan buenas enseñanzas

  21. Carola 21/01/2013 at 14:55 #

    Hola Buen dia, me sirvio de mucho el curso recien termine de crear todo. pero cuando ejecuto el emulador no hace mas que mostrarme la fecha y hora y nada mas. que puede ser ?

    Gracias por compartir el tutorial.

  22. mixael 03/02/2013 at 0:14 #

    la verdad siempre que trato de copiar las ordenes me lanza error aparece una x en la escritura

    no habla otro proyecto

  23. Gabriel Murugosa 05/02/2013 at 19:19 #

    Hola quisiera agradecerte por el excelente trabajo que has hecho.

    Sin duda es el mejor tutorial de android en Castellano, y lo mejor es que esta actualizado y que es muy fácil de entender.

    Los ejemplos me funcionaron perfecto, seguiremos con el curso que realmente esta muy interesante.

    Saludos,

    Gabriel

  24. Antuan 20/02/2013 at 18:13 #

    Simplemente daros las gracias.

  25. hvaldez 23/02/2013 at 15:17 #

    Hermano, me saco el sombrero por la calidad, estructura del contenido, redacción y utilidad de tu curso. Te felicito, Hace rato que no leo las ideas tan bien ordenadas como lo has hecho. Gracias!

  26. pablo 24/02/2013 at 0:52 #

    Hola,
    Tengo un problema, si no he entendido mal la explicacion, al escribir “@+id/TxtNombre” esto hace que se añada automaticamente una constante en la clase R para luedo poder usar la referencia R.id.TxtNombre ¿no?. Es que a mi cuando le he dado a “Run” me ha aparecido un mensaje de advertencia de que habia fallos y todos hacian referencia a que no localizaban las referencias “R.id…….” y he tenido que añadir las constantes manualmente. ¿Donde he fallado?¿Hay que hacer algo para que las autogenere?

    Gracias.

  27. Hugo 12/03/2013 at 17:33 #

    Pablo en el archivo /res/values/strings.xml seguramente habrás borrado la línea en la que pone:
    Settings

  28. fer 12/03/2013 at 18:04 #

    Hola
    Al intentar ejecutar la app me indica un error de compilacion

    Errors occurred during the build.
    Errors running builder ‘Android Package Builder’ on project ‘HolaUsr’.
    sun/security/x509/X500Name


    a lo cual tengo una duda, revisando en otros foros dicen que por la jvm, la que yo tengo es la 1.7 de oracle, me puedes ayudar a comprender cual es el error real en esto o que es lo que me falta por configurar y/o instalar
    Gracias!!

  29. Carlos S 14/03/2013 at 20:34 #

    Muchisimas gracias buen tutorial!!!

  30. Antonio 10/04/2013 at 22:49 #

    Hay un pequeño error en la parte del android-hola-usuario / src / net / sgoliver / android / holausuario/MainActivity.java

    en la parte de

    public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
    }

    no es R.menu.activity_main, menu, sino R.layout.activity_main, menu

    bueno tutorial!! UN SALUDOS!!

  31. Antonio 10/04/2013 at 23:47 #

    Una pregunta, ¿Porqué no me deja compilar la aplicación en un android 4.2.1?

    gracias saludos

  32. admin 11/04/2013 at 10:33 #

    Cuidado Antonio, porque la linea indicada en el artículo SÍ es correcta, lo que debes “inflar” es el menú, no el layout de la actividad. Por tanto lo correcto es R.menu.activity_main

    Saludos.

  33. Antonio 11/04/2013 at 10:50 #

    A que te refieres con inflar el menu, pues tengo todo el codigo identico al que poneis aqui y en esa linea me da fallo del tipo “activity_main cannot be resolved or is not a field”

    gracias por la rapida respuesta y haber si me puedes ayudar.

    pd: Poniendo lo que yo indique me compila en versiones anteriores a la 4.0

  34. Antonio 11/04/2013 at 11:29 #

    Vale admin ya lo tengo solucionado, el problema que habia que mi r por defecto lo crea como main a secas y en el vuestro como activity_main, e ahí el problema jaja solo tuve que poner main a secas y listo.

    Gracias por la ayuda y a seguir con este pedazo de manual!!

  35. Fran 29/04/2013 at 11:53 #

    Muy bueno crack!

  36. sta chevere... 29/04/2013 at 16:01 #

    chevere

  37. Fabian 02/05/2013 at 1:13 #

    Viejo Oliver!!! desde Colombia que alegría haber hecho la primera APP, estoy entusiasmado con este tema, quiero llegar a poder cosas con el protocolo bluetoth. aqui seguire pegado de tu curso.

  38. Luis 10/05/2013 at 0:09 #

    Que tal, excelente artículo,

    Sin embargo no se si sea mi ambiente o me haya faltado de configurar algo, pero me surgían los siguientes problemas al intentar correr el programa:

    1.- Al intentar correrlo con la versión 2.2 marca que el snapshot es incompatible, por lo que sólo “funciona” con la 4.2.
    2.- Al correrlo con la 4.2 el emulador se queda en blanco, bueno negro, y no arranca

    Lo solucioné al desactivar la opción “Snapshot” de cada instancia del emulador.

    Saludos

  39. Camilo Soto 14/05/2013 at 21:41 #

    Oliver! Gracias por el tuto, lo ejecute en un emulador como tu lo tienes tal cual creado pero se queda en la pantalla negra con las letras de android brillantes, ya lleva 15 min y nada

    por favor ayudame

  40. Luis Alberto 15/05/2013 at 20:09 #

    He estado siguiendo este curso, y todo de maravilla hasta correr la aplicación, me salen estos errores, estoy trabajando sobre windows XP.

    Alguien me pudiera decir por que muestra estos errores, Saludos.

    Android Launch!
    adb is running normally.
    Performing com.localhost.holausuario.MainActivity activity launch
    Launching a new emulator with Virtual Device ‘GALAXY’

    could not load func glBlendEquationSeparate
    could not load func glStencilFuncSeparate
    could not load func glIsProgram
    could not load func glIsShader
    could not load func glUniform1f
    could not load func glUniform1fv
    could not load func glUniform1i
    could not load func glUniform1iv
    could not load func glUniform2f
    could not load func glUniform2fv
    could not load func glUniform2i
    could not load func glUniform2iv
    could not load func glUniform3f
    could not load func glUniform3fv
    could not load func glUniform3i
    could not load func glUniform3iv
    could not load func glUniform4f
    could not load func glUniform4fv
    could not load func glUniform4i
    could not load func glUniform4iv
    could not load func glUniformMatrix2fv
    could not load func glUniformMatrix3fv
    could not load func glUniformMatrix4fv
    could not load func glAttachShader
    could not load func glBindAttribLocation
    could not load func glCompileShader
    could not load func glCreateProgram
    could not load func glCreateShader
    could not load func glDeleteProgram
    could not load func glDeleteShader
    could not load func glDetachShader
    could not load func glLinkProgram
    could not load func glUseProgram
    could not load func glValidateProgram
    could not load func glGetActiveAttrib
    could not load func glGetActiveUniform
    could not load func glGetAttachedShaders
    could not load func glGetAttribLocation
    could not load func glGetProgramiv
    could not load func glGetProgramInfoLog
    could not load func glGetShaderiv
    could not load func glGetShaderInfoLog
    could not load func glGetShaderSource
    could not load func glGetUniformfv
    could not load func glGetUniformiv
    could not load func glGetUniformLocation
    could not load func glShaderSource
    could not load func glStencilMaskSeparate
    could not load func glBlendEquationSeparate
    Failed to allocate memory: 8
    This application has requested the Runtime to terminate it in an unusual way.
    Please contact the application’s support team for more information.

  41. Daniel 17/05/2013 at 19:01 #

    Excelente tutorial!!, muchas gracias por tu valiosísima contribución.

Trackbacks/Pingbacks

  1. Tweets that mention Desarrollando una aplicación Android sencilla | sgoliver.net blog -- Topsy.com - 16/08/2010

    [...] This post was mentioned on Twitter by Babelias, Salva. Salva said: Publicado nuevo post sobre Android. Desarrollando una aplicación Android sencilla (http://www.sgoliver.net/blog/?p=1316) [...]

  2. Interfaces de usuario en Android: Layouts | sgoliver.net blog - 17/08/2010

    [...] el artículo anterior, donde desarrollamos una sencilla aplicación Android desde cero, ya hicimos algunos comentarios [...]

  3. Desarrollo en Android | sgoliver.net blog - 27/08/2010

    [...] Desarrollando una aplicación Android sencilla [...]

  4. Primeros pasos con Android: tutorial de App básica | victorpascual.es - 23/02/2011

    [...] idea, lo bueno y normal es hacerse un pequeño tutorial de inicio que dé las bases. Ahí va este: http://www.sgoliver.net/blog/?p=1316. Veamos qué tal va la cosa. Compartir [...]

  5. Desarrollando una aplicación Android | Android Wireless - 30/09/2012

    [...] Fuente original, creo que es el mejor tuto para iniciarse, asi pues, lo añado al portal, pero en es… [...]

  6. Componentes de una aplicación Android | sgoliver.net blog - 23/12/2012

    [...] el siguiente artículo empezaremos ya a ver algo de código, analizando al detalle una aplicación [...]

  7. Estadísticas del blog en 2012 | sgoliver.net blog - 02/01/2013

    [...] Por otro lado, las páginas más visitadas en el año 2012 han vuelto a ser con gran diferencia las dedicadas al Curso de Programación Android, especialmente el índice de contenidos, la sección dedicada a la obtención del curso en formato PDF, y los artículos iniciales sobre la instalación y configuración del entorno de desarrollo para Android, la estructura de un proyecto Android, y la creación de una aplicación Android sencilla de ejemplo. [...]

  8. Interfaz de usuario en Android: Widgets (II) | sgoliver.net blog - 18/04/2013

    [...] Este ID nos llega como parámetro del intent que ha lanzado la actividad. Como ya vimos en un artículo anterior del curso, este intent se puede recuperar mediante el métdo getIntent() y sus parámetros mediante [...]

Deja un comentario

Powered by WordPress. Designed by Woo Themes