Android SDK: Programación de aplicaciones en Java
Spanish (Español) translation by CYC (you can also view the original English article)
Nuestro objetivo en esta serie es aprender sobre el desarrollo de Android SDK. Hasta ahora hemos explorado las herramientas de desarrollo, hemos analizado la estructura de un proyecto de aplicación de Android, hemos comenzado a crear una interfaz de usuario y hemos respondido a la interacción del usuario. En este tutorial, veremos las estructuras y conceptos básicos en Java que necesita saber para comenzar a desarrollar aplicaciones para Android.
Introducción
Si ya estás familiarizado con Java, puedes ignorar esta sección. Si tienes un conocimiento limitado o no del idioma, este tutorial te indicará lo que debes aprender para avanzar con Android. Este tutorial no es suficiente en sí mismo para enseñarte Java desde cero, pero actuará como un manual para que comiences. Debes seguir el tutorial con aprendizaje Java adicional según sea necesario.
No pasaremos demasiado tiempo repasando los detalles en este tutorial, pero si estás luchando con alguno de los conceptos, consulta los Tutoriales de Oracle Java. Esta es una extensa guía del idioma que es accesible para principiantes. No te alarmes demasiado si te sientes un poco abrumado por lo que tratamos en este tutorial al principio, tendrá mucho más sentido una vez que comiences a implementar las estructuras en los proyectos de Android.
1. Sintaxis de Java
Paso 1
Ya vimos una pequeña sintaxis Java en nuestro proyecto de Android, pero para mayor claridad, comencemos otro proyecto. En lugar de un proyecto de Android, esta vez utilizaremos uno de Java para que pueda ver fácilmente las estructuras que usamos. Abra Eclipse. Haga clic en el botón "Nuevo". En el asistente que aparece, desplázate hacia abajo a la carpeta Java y amplíalo. Selecciona "Proyecto Java" y haz clic en "Siguiente".



Ingresa "MyJavaProject" como el nombre del proyecto y haz clic en "Finalizar". Eclipse luego crea tu nuevo proyecto en el área de trabajo. En el Explorador de paquetes, expanda la nueva carpeta del proyecto. Haz clic derecho en "src" y selecciona "Nuevo" y luego "Clase". Ingresa "MyMainClass" en el campo Nombre. Marca la casilla con "public static void main" al lado y haz clic en "Finish".



Eclipse crea su clase y la abre en el editor. No prestes mucha atención a la estructura del proyecto o al contenido existente de la clase porque tus proyectos de Android estarán estructurados de manera diferente. Puedes utilizar este proyecto para trabajar en tus habilidades de codificación Java, es más fácil ejecutar y probar el código que escribes aquí que con una aplicación de Android, y puedes centrarte en la sintaxis de Java.
La línea "public static void main" que ves en el archivo de clase es el método principal. Lo que está dentro de este método se ejecuta cuando se ejecuta la aplicación. El contenido del método es lo que aparece entre los corchetes después de "public static void main (String [] args)". Eclipse puede haber generado una línea "por hacer", simplemente ignórala. Crea una nueva línea después y agregaremos nuestro código allí.
Paso 2
En Java, una variable puede almacenar un valor de datos como una cadena de texto o un número. Cuando creas o "declaras" una variable en Java, debes especificar el tipo de datos dentro de ella y darle un nombre. Introduce lo siguiente:
1 |
int myNum; |
Esta línea declara una variable entera. Podemos declarar una variable y asignarle un valor extendiendo la línea:
1 |
int myNum = 5; |
Ahora podemos referirnos a esta variable usando su nombre. A continuación, agrega la siguiente línea, escribiendo el valor de la variable en la consola de salida:
1 |
System.out.println(myNum); |
Normalmente no escribirás en la salida del sistema de esta manera en tus aplicaciones de Android, sino que usarás la vista LogCat en su lugar. Sin embargo, escribir en el resultado de esta manera es una forma conveniente de probar tu código Java.
Paso 3
Vamos a ejecutar la aplicación. El proceso es ligeramente diferente para las aplicaciones de Android, pero lo veremos más adelante en la serie. Selecciona "Ejecutar" y luego "Ejecutar configuraciones". Selecciona "Aplicación Java" en la lista a la izquierda y haz clic en el botón "Nueva configuración de inicio" que se encuentra arriba. Eclipse selecciona automáticamente su nueva aplicación Java si es la única que tiene. De lo contrario, selecciónalo usando el botón "Buscar".



Haz clic en "Ejecutar" para ejecutar tu aplicación. Deberías ver el número cinco escrito en la vista de la consola debajo del editor. Puedes usar esta técnica para probar tu código Java a medida que lo aprendes.



Puedes ejecutar el último proyecto que ejecutaste en cualquier momento usando el botón "Ejecutar" en la barra de herramientas.



Paso 4
Usarás la misma sintaxis cada vez que declares una variable en Java. Para asignar un valor diferente a la variable más adelante en el programa, puedes consultarlo por su nombre:
1 |
myNum = 3; |
Esto sobrescribe el valor existente. En Java hay muchos tipos de variables diferentes. El int se conoce como un tipo primitivo, junto con algunos otros tipos de números, char para los valores de los caracteres y booleano, que almacena un valor verdadero o falso. También hay tipos de objetos; exploraremos Objetos más tarde. Un tipo de objeto esencial para familiarizarse es String, que almacena una cadena de texto:
1 |
String myName = "Sue"; |
Los valores de cadena de texto están entre comillas. Puedes incluir estos directamente en algunos casos, por ejemplo:
1 |
System.out.println("number: " + myNum); |
Agrega este código y ejecútalo; la consola mostrará: "número:" seguido del valor de la variable.
Paso 5
Arriba vimos el operador de asignación "=" - aquí hay algunos de los otros operadores comunes:
1 |
//add
|
2 |
myNum = 5+6; |
3 |
//subtract
|
4 |
myNum = 7-3; |
5 |
//multiply
|
6 |
myNum = 3*2; |
7 |
//divide
|
8 |
myNum = 10/5; |
9 |
//remainder
|
10 |
myNum = 10%6; |
11 |
//increment (add one)
|
12 |
myNum++; |
13 |
//decrement (subtract one)
|
14 |
myNum--; |
Los operadores se pueden usar tanto en variables como en números codificados (como se indicó anteriormente):
1 |
int myNum = 5; |
2 |
int myOtherNum = 4; |
3 |
int total = myNum+myOtherNum;//9 |
Paso 6
Otra estructura de Java que es esencial para Android es el comentario. Puedes agregar un comentario de dos maneras:
1 |
//this is a single line comment
|
2 |
|
3 |
/* This is a multiline comment
|
4 |
* stretching across lines
|
5 |
* to give more information
|
6 |
*/
|
Es vital adquirir el hábito de comentar tu código mientras lo escribes, para tu propio beneficio, así como para cualquier otra persona que lea el código.
2. Estructuras de control
Paso 1
El código que agregamos al método principal se ejecuta cuando se ejecuta la aplicación Java. Cuando la aplicación de Android que creamos se ejecuta, lo que está en el método onCreate de la actividad principal es lo que se ejecuta. Cada línea dentro de estos métodos se ejecuta después de la línea anterior, pero el flujo de ejecución no siempre es lineal. Hay muchas estructuras de control involucradas en Java, así que veamos algunas de las más comunes, comenzando con las condicionales.
Las declaraciones condicionales implican llevar a cabo pruebas para determinar el flujo de ejecución. La estructura condicional más simple en Java es la declaración if:
1 |
if(myNum>3) |
2 |
System.out.println("number is greater than 3"); |
Esta prueba determina si el valor de la variable es mayor que tres. Si es así, la cadena se escribirá en la salida. De lo contrario, no se escribirá nada y el procesamiento simplemente pasará a la siguiente línea del programa. Decimos que una prueba condicional "devuelve" un valor verdadero o falso. Verdadero y falso son valores booleanos. Podemos agregar un else, que solo se ejecuta si el if devuelto es falso:
1 |
if(myNum>3) |
2 |
System.out.println("number is greater than 3"); |
3 |
else
|
4 |
System.out.println("number is not greater than 3"); |
El resto se ejecuta si el valor es tres o menos. Prueba el código con diferentes valores para la variable entera para ver los resultados de las pruebas condicionales. También podemos encadenar múltiples pruebas:
1 |
if(myNum>10) |
2 |
System.out.println("number is greater than 10"); |
3 |
else if(myNum>7) |
4 |
System.out.println("number is greater than 7"); |
5 |
else if(myNum>3) |
6 |
System.out.println("number is greater than 3"); |
7 |
else
|
8 |
System.out.println("number is 3 or less"); |
Cada prueba se realiza solo si todas las pruebas anteriores en la cadena retornaron false. Entonces, para cualquier número, solo se emite una cadena. Puedes encadenar tantos else if a otras declaraciones si lo necesitas. También puede usar if si las sentencias están encadenadas con uno o más else if sin final else.
Probamos para que un número sea mayor que otro. Prueba las siguientes variaciones:
1 |
if(myNum<10) |
2 |
System.out.println("number less than 10"); |
3 |
if(myNum==10) |
4 |
System.out.println("number equals 10"); |
5 |
if(myNum!=10) |
6 |
System.out.println("number is not equal to 10"); |
7 |
if(myNum>=10) |
8 |
System.out.println("number either greater than or equal to 10"); |
9 |
if(myNum<=10) |
10 |
System.out.println("number either less than or equal to 10"); |
Puedes llevar a cabo pruebas similares en otros tipos de variables, incluidas las cadenas. Para realizar múltiples pruebas a la vez, usa la siguiente sintaxis:
1 |
if(myNum>=10 && myNum<=50) |
2 |
System.out.println("number is between 10 and 50"); |
El "&&", conocido como el operador "and", significa que toda la declaración solo retornará verdadera si ambas pruebas retornan verdadero. El operador "o" retornará verdadero si cualquiera de las pruebas retorna verdadera:
1 |
if(myNum<0 || myNum!=-1) |
2 |
System.out.println("number is less than 0 or not equal to -1"); |
Para agrupar el código en un bloque, podemos usar corchetes: todo el código entre corchetes se ejecuta si esta prueba retorna verdadera:
1 |
if(myNum<10) |
2 |
{
|
3 |
System.out.println("number less than 10"); |
4 |
myNum=10; |
5 |
}
|
Dichos corchetes agrupan el código en bucles, métodos y clases.
Paso 2
Miremos los bucles ahora. El siguiente ciclo for itera diez veces, lo que significa que tu contenido se ejecuta diez veces:
1 |
for(int i=0; i<10; i++){ |
2 |
System.out.println(i); |
3 |
}
|
La primera expresión en el esquema for inicializa una variable entera contraria a cero. La segunda expresión es una prueba condicional, verificando que la variable sea menor que diez. Si esto retorna verdadero, el contenido del ciclo se ejecuta, si no, el ciclo finalizará. Una vez que se ha ejecutado el contenido del ciclo, se ejecuta la tercera expresión, incrementando el contador.
El ciclo while usa una sintaxis ligeramente diferente. El siguiente ejemplo tiene el mismo efecto que el ciclo for:
1 |
int i=0; |
2 |
while(i<10){ |
3 |
System.out.println(i); |
4 |
i++; |
5 |
}
|
Los bucles pueden contener varias líneas de código, incluidos otros bucles.
Paso 3
Ya hemos encontrado el método principal y el método onCreate de Android. Veamos cómo crear tus propios métodos. Coloca el siguiente método después del corchete de cierre para tu método principal:
1 |
public static void doSomething(){ |
2 |
System.out.println("something"); |
3 |
}
|
Este método se define como público, lo que significa que cualquier clase en el proyecto puede invocar su procesamiento. Si fue "privado", solo es accesible dentro de la clase (esto es "visibilidad"). Normalmente no tendrás que incluir el modificador "estático" en tus primeras aplicaciones de Android, así que ignóralas. El "vacío" representa el tipo de devolución. En este caso, el método no retorna nada. Para ejecutar el método, agrega una llamada en tu método principal:
1 |
doSomething(); |
Ejecuta tu aplicación para ver esta función. Altera el método para retornar un valor:
1 |
public static int doSomething(){ |
2 |
return 5; |
3 |
}
|
Altera la llamada al método y vuelve a ejecutar:
1 |
System.out.println(doSomething()); |
El valor devuelto está escrito. Los métodos también pueden recibir parámetros:
1 |
public static int doSomething(int firstNum, int secondNum){ |
2 |
return firstNum*secondNum; |
3 |
}
|
Al llamar al método, debes pasar parámetros del tipo y número correctos:
1 |
System.out.println(doSomething(3, 5)); |
Los métodos pueden dividir el procesamiento de aplicaciones en fragmentos lógicos. Son particularmente útiles si necesitas realizar las mismas tareas más de una vez; simplemente los defines en el método y luego los llamas cuando lo necesites. Si cambias el proceso, solo necesitas cambiarlo en el código del método.
3. Clases y objetos
Paso 1
Hemos visto cómo se pueden usar los métodos para reutilizar el código y dividirlo en secciones lógicas. Las clases y objetos hacen esto en una escala mayor. Puedes dividir las tareas en una aplicación entre objetos, con cada objeto teniendo un conjunto de responsabilidades definidas por su clase. Esto es similar a un método que es responsable de un área particular de funcionalidad, pero un objeto puede tener múltiples métodos y también almacenar valores de datos.
Imagina que estás creando un juego: puedes crear una clase dedicada a manejar los detalles del usuario. Selecciona tu paquete de aplicación, en "src", en el Explorador de paquetes. Haz clic derecho y elije "Nuevo" y luego "Clase". Ingresa "GameUser" como nombre de clase, asegúrate de que la casilla de verificación del stub del método principal esté desmarcada esta vez y haz clic en "Finalizar". Eclipse entonces abre el archivo de clase, que inicialmente solo tiene el contorno de declaración de clase:
1 |
public class GameUser { |
2 |
//class content
|
3 |
}
|
Todo lo que agregues se encuentra entre estos corchetes (a menos que agregues declaraciones de importación, que se enumeran arriba de esta sección). Tus aplicaciones de Android notan que los archivos de clase muestran el nombre del paquete en la parte superior. No aparece aquí porque utilizamos el paquete predeterminado.
Paso 2
Dentro de la clase, agrega un par de variables:
1 |
private String playerName; |
2 |
private int score; |
Estas se llaman "variables de instancia" porque están definidas para cada instancia de la clase que creamos. Agrega un método constructor después de estos. Esto es lo que se ejecuta cuando se crea un objeto de la clase:
1 |
public GameUser(String userName, int userScore){ |
2 |
playerName=userName; |
3 |
score=userScore; |
4 |
}
|
El constructor siempre tiene el mismo nombre que la clase y puede o no requerir parámetros. El constructor normalmente debe asignar valores a las variables de instancia, a menudo usando los parámetros.
Paso 3
La clase también puede definir métodos. Agrega el siguiente conjunto típico después del constructor:
1 |
public String getName() {return playerName;} |
2 |
public int getScore() {return score;} |
3 |
public void setName(String newName) {playerName=newName;} |
4 |
public void setScore(int newScore) {score=newScore;} |
Estos se conocen como métodos get y set, getters y setters, porque proporcionan código externo a la clase con la capacidad de recuperar y establecer los valores de las variables de instancia. Echa un vistazo a la vista de Esquema en Eclipse para ver cómo puedes ayudarlo a navegar por el contenido de la clase.

Paso 4
Guarda tu nuevo archivo de clase. De vuelta en tu clase principal, crea un objeto de la nueva clase en el método principal:
1 |
GameUser aUser = new GameUser("Jim", 0); |
Pasamos los parámetros enumerados en el constructor - la palabra clave "nueva" hará que el constructor se ejecute. Ahora podemos usar esta instancia de la clase para acceder a los valores de datos en ella llamando a sus métodos:
1 |
System.out.println(aUser.getScore()); |
2 |
aUser.setScore(5); |
3 |
System.out.println(aUser.getScore()); |
Ejecuta el programa para ver cómo cambia el valor después de llamar a los métodos públicos en el objeto. Puedes crear varias instancias del objeto que se administrarán por separado:
1 |
GameUser anotherUser = new GameUser("Jane", 5); |
4. Herencia e interfaces
Paso 1
Hemos visto cómo una clase define los conjuntos de responsabilidades que puede utilizar al crear instancias de objetos. Esto se aplica no solo a las clases que creas tú mismo, sino también a las clases existentes de Java y Android que también puedes usar. Además de crear instancias de estas clases de plataforma, puedes extenderlas usando herencia. Con la herencia, puedes crear una clase que hereda la funcionalidad de una clase existente a la vez que proporciona su propio procesamiento. Vimos un ejemplo de esto en el primer proyecto de Android que creamos, con la clase de actividad principal.
Abre la clase ahora. En la línea de apertura de la declaración de clase, verás "extiende la Actividad". Esto significa que la clase es una subclase de la clase Activity de Android. El uso de la clase Activity permite que Android maneje los detalles de la presentación de una pantalla al usuario, con métodos para cuando la pantalla está en varios estados (creado, en pausa, destruido, etc.). Esto te permite enfocarte en los aspectos únicos de la aplicación, agregando código a los métodos definidos en la declaración de la clase de actividad de Android y métodos adicionales propios si es necesario.
Este es un patrón que a menudo usarás en Android, ampliando las clases definidas para los aspectos comunes de las aplicaciones. Puedes complementar estos con tus propias clases cuando sea apropiado.
Paso 2
Mira nuevamente tu línea de apertura de la clase Activity. Recuerda que agregamos "implementa OnClickListener" para manejar los clics en un botón en la interfaz de usuario. Esto se conoce como implementación de una interfaz. Una interfaz es similar a una clase que hereda de "extender", excepto que la declaración de interfaz simplemente enumera los contornos del método. Debes proporcionar la implementación del método para cada uno de ellos. Entonces, cuando implementamos OnClickListener, nos comprometimos a proporcionar un método onClick, lo cual hicimos. Una interfaz es, por lo tanto, como un contrato. Con la herencia, la extensión de clases hereda las implementaciones de métodos proporcionadas en la declaración de clase para su superclase (la clase se extiende). Puedes anular estas implementaciones si es necesario.
Conclusión
En este tutorial describimos algunas de las características esenciales de la sintaxis de Java que necesita comprender. Hay más estructuras y conceptos para familiarizarse. Si no tienes experiencia en Java y quieres asegurarte de que sabes lo suficiente para desarrollar efectivamente para Android, utiliza los Tutoriales de Oracle de Java. Los temas a considerar para aprender incluyen matrices y declaraciones de cambio. Más adelante en la serie veremos algunas de las clases de Android más comunes que probablemente utilizarás. En la siguiente parte, exploraremos los recursos en un proyecto de aplicación de Android.



