lunes, 19 de agosto de 2013

Conceptos JAVA

En esta entrada vamos a intentar hincarle un poco más el diente al asunto. ¡Vamos a ello!

ESTRUCTURA DE UN PROGRAMA
Normalmente, el código de toda aplicación Java se agrupa en clases, que son el esqueleto de nuestra aplicación. Estas clases se definen en unos ficheros fuente con el mismo nombre de la clase, tal y como ocurría en el primer ejemplo de Guille:



Aquí vemos que se ha definido la clase de objetos MainActivity dentro del archivo MainActivity.java. A continuación se escribe el cuerpo de la clase entre corchete {..}. Es en este bloque de código donde se escriben las acciones que va a llevar a cabo nuestro programa. Dentro de cada clase, se llama a los distintos métodos (seguidos siempre de un modificador entre paréntesis (…)). Cada método ejecutará alguna acción que debe realizar la aplicación. Normalmente cada método llama a un paquete de las librerías externas para realizar dicha acción (es decir, envía un mensaje a otro método o a otra clase de objeto). Tenemos librerías android, java,… debiendo escribir siempre la ruta del archivo al completo. Si no queremos escribir toda la ruta cada vez que llamemos a la librería, podemos definir la ruta al inicio del fichero mediante el comando import. Así, en el ejemplo anterior vemos que en el modificador del método onCreate no es necesario definir la clase Bundle por su ruta completa, ya que más arriba se ha llamado a su ruta:
            import android.os.Bundle;
Como resumen, vemos que nuestro programa estará formado por objetos (que pueden ser ventanas o controladores) creados a partir de las clases. Los objetos se comunicarán entre sí a través de mensajes, y cada objeto sólo podrá responder a los mensajes que correspondan a los métodos de su clase. Estos mensajes se denominan eventos, los cuales interactúan cuando ocurre algún suceso.

LENGUAJE JAVA
TIPOS
Si hacemos memoria, esto que os voy a explicar se parece mucho a la programación en FORTRAN 95. Se trata de los tipos, es decir, la precisión con la que definimos nuestras variables. En Java podemos encontrar los siguientes:

Tipo Java
Bytes
Rango de Valores
boolean

true y false
byte
1
-128 a 127
short
2
-32768 a 32767
int
4
-2147483648 a 2147483647
long
8
-9223372036854775808 a 9223372036854775807
char
2
0 a 65535
float
4
+/- 3.4028235E+38
double
8
+/-1.79769313486231570E+308

Un ejemplo de ello seria:
            int dato1= 0;


CLASES
Una clase es un tipo de objetos definidos por el usuario. La clase String de la biblioteca JVC (Java Foundation Classes) está definida así:

class String
{
//Atributos
//Métodos
}

Nosotros mismos podemos crear objetos de esa misma clase. Podemos hacerlo del siguiente modo:

String sTexto = new String(“abc”)

Con estas líneas, hemos creado el objeto sTexto de la clase String con la cadena de caracteres abc. La clase String tiene definido en su archivo String.class todos los métodos que lo componen. Aquellos métodos que sean de acceso público (public), podrán ser llamados en nuestro fichero. Por ejemplo, podemos utilizar el método charAt(int i) de la clase String para conocer el carácter que se encuentra en la posición i. En nuestro ejemplo, nos devolvería la letra correspondiente a la posición 1 (letra b):

char caracter = sTexto.charAt(1);

Otro aspecto importante en el mundo de las clases es la “herencia”.  Podemos crear una clase derivada de otra, es decir, que herede todos los atributos y métodos de la clase padre. De este modo, esta clase podrá ser manipulada por los métodos heredados y por los suyos propios. Por ejemplo:

class MiForm extends JFrame
{
//Atributos
//Métodos
}

La clase MiForm se verá afectada por los métodos propios y por los métodos heredados de la clase JFrame (JFrame es un tipo de contenedor o layout de alto grado). Si volvéis a la imagen anterior en el ejemplo de Guille, veréis cómo la clase ActivityMain hereda los atributos de la clase Activity.

DECLARACIÓN DE CONSTANTES SIMBÓLICAS
Declarar una constante simbólica significa decirle al compilador Java el nombre de la constante y su valor. Para hacerlo, se utiliza el calificador final o final static. Si se añade static, sólo existirá una copia de la constante para todos los objetos que se declaren de esa clase; en caso contrario, cada objeto incluirá su propia copia de la constante. Ejemplo:

    final static int cte1 = 1;
    final static String cte2 = “Pulse una tecla para continuar”;
    final double cte3 = 3.1415926;


VARIABLES
Al declarar una variable, estamos reservando un espacio para almacenar un valor de un determinado tipo. Podemos declarar más de una variable a la vez, y definir el valor que representan (si no lo ponemos, el valor por defecto será 0 ó null). Ejemplos de variables serían:
            short día, mes, año=2001;
            int contador = 0;
            String Nombre = “”, Apellidos = “”;
Estas variables se pueden declarar dentro del bloque de una clase, de un método o de un bloque entre corchetes {…}. Las variables sólo podrán ser usadas mientras el método se esté ejecutando. Para que dicha variable pueda o no ser accesible fuera del ámbito de la clase en la que ha sido definida, utilizamos los calificadores public o private. Por ejemplo:

public class ElementosJava
{
            public static int v = 16;
            private double p;
            String m;
            public void Test ()
{
int contador = 0;
//…
}
//…
}

Si ahora quisiéramos acceder a la variable “v” desde fuera de la clase ElementosJava, habrá que hacer referencia a la clase, ya que se ha utilizado el atributo static:

ElementosJava.v

Dentro de los métodos (como en el caso de Test()), no se pueden utilizar calificadores del tipo private, public o static, ya que la accesibilidad de las variables en este caso se limita únicamente al método, siendo de uso local.

EJEMPLO PARA ASENTAR LO APRENDIDO
Vamos a aplicar todo lo anterior en un sencillo ejemplo. Está programado para el IDE NetBeans que es específico para Java, pero si lo necesitáis, ya lo traspasaremos a AS. Se trata de una aplicación capaz de calcular el área de un círculo. Para ello tendremos la clase principal (MainActivity) y la clase Circulo, al cual llamaremos para que nos calcule el área dado un radio concreto:

MainActivity.java

package hagamosunaapp.blogspot.com.calculoarea;

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

public class MainActivity extends Activity {

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


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

    public static void main(String[] args)
    {
        double r = 10.0;
        Circulo unCirculo = new Circulo(r);
        double area = unCirculo.areaCirculo();
        System.out.println("Área = " + area);
    }
   
}

El método main declara la variable “r” con precisión doublé y valor 10.0. Crea un objeto identificado como unCirculo con los mismos atributos que la clase Circulo, y de radio r. También declara la variable “área”, que llama al método areaCirculo del objeto unCirculo (dicho método se define en Circulo.java), y por último mostramos el valor en pantalla llamando al método println de la clase out de la biblioteca System.

Circulo.java

package hagamosunaapp.blogspot.com.calculoarea;

/**
 * Created by imac on 19/08/13.
 */
public class Circulo
{
    private final static double PI = 3.1415926;
    private double radio;

    public Circulo(double r)
    {
        radio = r;
    }

    public double areaCirculo()
    {
        double area = PI * radio * radio;
        return area;
    }

}


Definimos la variable PI, que sólo podrá ser utilizada por la clase Circulo, y también la variable radio. Creamos un método también denominado Circulo que le da el valor r a la variable radio, y el método areaCirculo que calcula el área final, devolviendo el valor que le pide la clase MainActivity.

Y hasta aquí el tutorial de hoy. Todo aquello que no comprendáis podéis comentarlo, e intentaré explicarlo mejor (o aprenderlo bien, vaya!).



Un saludo amigos!

jueves, 8 de agosto de 2013

SUDOKU II: Implementar el Cuadro ABOUT


Hoy vamos a aprender a conectar unas actividades con otras. Para ello, vamos a diseñar un cuadro About que nos dé la información básica sobre nuestro Sudoku. Deberá activarse en el momento que presionemos el botón About, mostrar el texto que queremos y retroceder a la página anterior al presionar la tecla Volver. Existen tres métodos para conseguir nuestro objetivo:

-Definiendo una nueva actividad e iniciándola.
-Utilizando la clase AlertDialog y mostrándola.
-Con una subclase de la clase Dialog de Android y mostrándola.

Nosotros vamos a aprender el primer método. El primer paso será la creación del layout (el contenedor) de nuestra actividad About. Creamos el archivo res/layout/about.xml de tipo ScrollView (lo escribimos en el recuadro Root Element):



<?xml version="1.0" encoding="utf-8"?>

<ScrollView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="10dip">
    <TextView
        android:id="@+id/about_content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</ScrollView>

Si os habéis dado cuenta, esta vez, en lugar de hacer referencia a un ID de recurso ya definido en el directorio res, hemos usado la sintaxis @id+/---,  de modo que ya estamos creando un nuevo ID de recurso al que podremos hacer referencia más tarde en otras actividades. Vamos a añadir esta sintaxis al layout activity_main.xml que ya habíamos creado en la entrada SUDOKU I (tanto en layout como layout-land):



Vamos a añadir ahora el texto que necesitamos mostrar mediante el archivo strings:
Sudoku/src/main/res/values/strings.xml


<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">Sudoku</string>
    <string name="action_settings">Settings</string>
    <string name="main_title">Android Sudoku</string>
    <string name="continue_label">Continue</string>
    <string name="new_game_label">New Game</string>
    <string name="about_label">About</string>
    <string name="exit_label">Exit</string>
    <string name="hello_world">Hello world!</string>
    <string name="about_title">About Android Sudoku</string>
    <string name="about_text">\
    Sudoku is a logic-based number placement puzzle.
    Starting with a partially completed 9x9 grid, the
    objective is to fill the grid so that each
    row, each column, and each of the 3x3 boxes
    (also called <i>blocks</i>) contains the digits
    1 to 9 exactly once.
    </string>

</resources>

La barra invertida (\) en about_text hace que no aparezca un espacio antes de la primera palabra del texto.

El siguiente paso será definir nuestra actividad About en About.java.  El archivo About.java debemos crearlo nosotros mismos. Para ello vamos nuestra carpeta fuente y creamos una nueva clase llamada About:



Sudoku/src/main/java/hagamosuna…/About.java

package hagamosunaapp.blogspot.com.sudoku;

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

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


Los métodos que se reflejan en este código podéis verlos en la siguiente página: http://developer.android.com/reference/android/app/Activity.html. En general, lo que estamos haciendo en primer lugar es importar los paquetes API Android que necesitamos. Después, definimos la clase About y la extendemos a una actividad. Como queremos iniciar dicha actividad, llamamos a OnCreate (guardando el estado actual), y después a setContentView(int), que nos permite crear la interfaz del usuario mediante el recurso que ya hemos creado: about.xml.

Como queremos conectar la clase Sudoku con la clase About al presionar el botón About de nuestra página principal, nos dirigimos a la clase Sudoku.java y añadimos lo siguiente:

Sudoku/src/main/java/hagamosuna…/Sudoku.java


package hagamosunaapp.blogspot.com.sudoku;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.content.Intent;
import android.view.View;
import android.view.View.OnClickListener;

public class Sudoku extends Activity {

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

        View continueButton = findViewById(R.id.continue_button);
        continueButton.setOnClickListener (this);
        View newButton = findViewById(R.id.new_button);
        newButton.setOnClickListener (this);
        View aboutButton = findViewById(R.id.about_button);
        aboutButton.setOnClickListener (this);
        View exitButton = findViewById(R.id.exit_button);
        exitButton.setOnClickListener (this);
    }


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

Las líneas que hemos añadido nos han servido para importar las intenciones que precisábamos (una intención sirve para describir una acción específica, como “sacar una foto”, “presionar un botón”, etc.), y por otro, hemos llamado a findViewById para buscar una vista Android en base a su ID de recurso, y setOnClickListener() para indicarle a Android qué objeto selecciona el usuario. En nuestro caso lo hemos hecho para todos los botones. Si os habéis dado cuenta, esta vez hemos llamado al recurso mediante la nomenclatura id.xxx_button, de forma que AS buscará automáticamente en el archivo de recursos res/layout/activity_main.xml aquellos objetos que hallamos definido como @+id/xxx_button.

Ya hemos atribuido la variable this al método setOnClickListener para implementar la interfaz Java OnclickListener. Sin embargo, para que la clase actual (Sudoku.java) implemente dicha interfaz sin errores, tendremos que añadir el método onClick (el cual viene incluido en OnClickListener):

Sudoku/src/main/java/hagamosuna…/Sudoku.java

package hagamosunaapp.blogspot.com.sudoku;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.content.Intent;
import android.view.View;
import android.view.View.OnClickListener;

public class Sudoku extends Activity implements OnClickListener{

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

        View continueButton = findViewById(R.id.continue_button);
        continueButton.setOnClickListener (this);
        View newButton = findViewById(R.id.new_button);
        newButton.setOnClickListener (this);
        View aboutButton = findViewById(R.id.about_button);
        aboutButton.setOnClickListener (this);
        View exitButton = findViewById(R.id.exit_button);
        exitButton.setOnClickListener (this);
    }

    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.about_button:
                Intent i=new Intent (this, About.class);
                startActivity(i);
            break;
        }
    }

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

Con estas líneas, hemos creado la instancia de clase Intent que nos permite iniciar la actividad About una vez presionamos el botón correspondiente.

Por último, el paso más importante es el de declarar la actividad About en AndroidManifest.xml. TODAS las actividades deben ser declaradas aquí. Nos dirigimos al directorio adecuado y añadimos estas líneas:

Sudoku/src/main/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="hagamosunaapp.blogspot.com.sudoku"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="7"
        android:targetSdkVersion="16" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="hagamosunaapp.blogspot.com.sudoku.Sudoku"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".About"
            android:label="@string/about_title" >
        </activity>
    </application>

</manifest>

Si corremos ahora nuestra aplicación, y pinchamos en el botón About, debemos encontrarnos algo parecido a esto:



Para darle algo más de vida, podemos aplicar uno de los temas que incluye Android. Nosotros mismos podríamos crear uno de ellos, pero en este caso vamos a utilizar uno ya existente. Para ello, volvemos a AndroidManifest.xml, y añadimos una nueva línea:

Sudoku/src/main/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="hagamosunaapp.blogspot.com.sudoku"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="7"
        android:targetSdkVersion="16" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="hagamosunaapp.blogspot.com.sudoku.Sudoku"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".About"
            android:label="@string/about_title"
            android:theme="@android:style/Theme.Dialog">
        </activity>
    </application>

</manifest>



Y eso es todo! Si tenéis algún problema no dudéis en preguntar.

Un saludo! Y mucho ánimo navegantes!!




Jaime