Bienvenidos sean a este post, hoy veremos el segundo ejemplo de clases en Java con Android Studio. En este caso, veremos como trabajar con varias clases, vamos a ver una funcion nueva y algunas funciones matematicas, pongamos manos a la obra.

Anuncios

Abramos Android Studio y seleccionanos Nuevo Proyecto

android00

Ahora vamos a setear los datos de la nueva app

android17

En Application name ponemos Mis Lugares Java, en Company domain pueden utilizar cualquiera, en mi caso utilizo mi dominio pero pueden usar example.org, luego dejan el resto como figura y pulsan Next

android02

En este cuadro lo dejan como aparece y pulsan Next

android03

Aca seleccionan Add No Activity y pulsan Finish, esto es para generar una app sin ningun tipo de clase, actividad o funcion, es decir una app en blanco, una vez pulsado Finish se abrira la IDE de Android Studio, cuando este finalmente abierto vamos a seleccionar File->New->New Module

android04

Una vez seleccionada esta opcion nos aparecera el siguiente cuadro

Anuncios
android05

Donde seleccionaremos Java Library, una vez seleccionado pulsamos Next y nos iremos al siguiente cuadro

android18

En Library name ingresan el nombre MisLugares, Java package name se genera automaticamente y debe quedar como figura, es lo mas recomendable, y por ultimo Java class name lo setearemos con Lugar, una vez hecho esto pulsamos Finish y volveremos a la IDE apareciendo la nueva clase, en caso de no aparecer debemos ir a File->Sync project with gradle files para volverlo a sincronizar

android19

Una vez finalizada la sincronizacion nos quedara de la siguiente forma

android20

Ahora procederemos a completar el codigo para esta clase:

package org.example.mislugares;

public class Lugar {
    private String nombre;
    private String direccion;
    private GeoPunto posicion;
    private String foto;
    private int telefono;
    private String url;
    private String comentario;
    private long fecha;
    private float valoracion;

    public Lugar(String nombre, String direccion, double longitud, 
                 double latitud, int telefono, String url, 
                 String comentario, int valoracion) {
        fecha = System.currentTimeMillis();
        posicion = new GeoPunto(longitud, latitud);
        this.nombre = nombre;
        this.direccion = direccion;
        this.telefono = telefono;
        this.url = url;
        this.comentario = comentario;
        this.valoracion = valoracion;
    }
}
Anuncios

Analicemos este codigo, primero vamos a crear los atributos y tambien un objeto de la clase GeoPunto (no se preocupen mas adelante vamos a definirlo pero por ahora solo lo creamos), entre los datos a guardar van a ser nombre, direccion, posicion, foto, telefono, url, comentario, fecha y valoracion, una vez declarados nuestros atributos pasaremos a nuestro constructor, este va a ser la forma de definir los valores a nuestra clase cuando la utilicemos por medio de un objeto, observen como en la zona de atributos de este constructor vamos a ingresar varios datos, y luego en el cuerpo del constructor por medio del apuntador this vamos a asignarselos, veamos una linea de ejemplo:

this.nombre = nombre;

Donde this.nombre es el atributo en la clase y va a contener el valor enviado por nosotros al crear el objeto de esta clase, esto ocurre con todas y cada una de las lineas salvo con fecha, donde utilizaremos el metodo currentTimeMillis() del objeto System para obtener una fecha en formato Unix, esta es la cantidad en segundos transcurridos desde la medianoche del 1 de Enero de 1970, no se preocupen por ahora no necesitamos formatearlo es simplemente como dato. Ahora como vimos tenemos definidos los atributos de la clase y su constructor, ahora en lugar de defnir un metodo vamos a utilizar la siguiente opcion, hacemos click con el boton derecho sobre el codigo recien ingresado, elegimos la opcion Generate

android21

Una vez seleccionado, debemos utilizar la opcion Getter and Setter

android22

Una vez seleccionado nos aparecera el siguiente cuadro

android23

Como pueden ver, apareceran todas los atributos de la clase, aca mientras tenemos apretado Ctrl vamos selecccionado los atributos, o podemos presionar el primero mantener apretado Mayus y seleccionar el ultimo para seleccionarlos, en cualquiera de los dos casos debemos seleccionar a todos y debe quedar como la imagen superior, una vez hecho esto presionen Ok y el codigo quedara de la siguiente manera

package org.example.mislugares;

public class Lugar {
    private String nombre;
    private String direccion;
    private GeoPunto posicion;
    private String foto;
    private int telefono;
    private String url;
    private String comentario;
    private long fecha;
    private float valoracion;
    
    public Lugar(String nombre, String direccion, double longitud, 
                 double latitud, int telefono, String url, 
                 String comentario, int valoracion) {
        fecha = System.currentTimeMillis();
        posicion = new GeoPunto(longitud, latitud);
        this.nombre = nombre;
        this.direccion = direccion;
        this.telefono = telefono;
        this.url = url;
        this.comentario = comentario;
        this.valoracion = valoracion;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getDireccion() {
        return direccion;
    }

    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }

    public GeoPunto getPosicion() {
        return posicion;
    }

    public void setPosicion(GeoPunto posicion) {
        this.posicion = posicion;
    }

    public String getFoto() {
        return foto;
    }

    public void setFoto(String foto) {
        this.foto = foto;
    }

    public int getTelefono() {
        return telefono;
    }

    public void setTelefono(int telefono) {
        this.telefono = telefono;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getComentario() {
        return comentario;
    }

    public void setComentario(String comentario) {
        this.comentario = comentario;
    }

    public long getFecha() {
        return fecha;
    }

    public void setFecha(long fecha) {
        this.fecha = fecha;
    }

    public float getValoracion() {
        return valoracion;
    }

    public void setValoracion(float valoracion) {
        this.valoracion = valoracion;
    }

}
Anuncios

Observen como se agregaron los metodos para recuperar y modificar los atributos de esta clase por todas las clases pertenecientes (y objetos creados de esta) a esta app, una vez realizado esto volvemos a hacer click con el boton derecho sobre el codigo de la clase y elegimos Generate nuevamente

android21

Pero en el siguiente cuadro, elegiremos toString()

android25

Una vez seleccionada, nos aparecera el siguiente cuadro

android26

Aca volveremos a seleccionar todos los atributos, y presionaremos Ok. Una vez hecho esto el codigo fuente nos quedara de la siguiente manera

package com.tinchicus.mislugares;

public class Lugar {
    private String nombre;
    private String direccion;
    private GeoPunto posicion;
    private String foto;
    private int telefono;
    private String url;
    private String comentario;
    private long fecha;
    private float valoracion;

    @Override
    public String toString() {
        return "Lugar{" +
                "nombre='" + nombre + '\'' +
                ", direccion='" + direccion + '\'' +
                ", posicion=" + posicion +
                ", foto='" + foto + '\'' +
                ", telefono=" + telefono +
                ", url='" + url + '\'' +
                ", comentario='" + comentario + '\'' +
                ", fecha=" + fecha +
                ", valoracion=" + valoracion +
                '}';
    }

    public Lugar(String nombre, String direccion, double longitud, 
                 double latitud, int telefono, String url, 
                 String comentario, int valoracion) {
        fecha = System.currentTimeMillis();
        posicion = new GeoPunto(longitud, latitud);
        this.nombre = nombre;
        this.direccion = direccion;
        this.telefono = telefono;
        this.url = url;
        this.comentario = comentario;
        this.valoracion = valoracion;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getDireccion() {
        return direccion;
    }

    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }

    public GeoPunto getPosicion() {
        return posicion;
    }

    public void setPosicion(GeoPunto posicion) {
        this.posicion = posicion;
    }

    public String getFoto() {
        return foto;
    }

    public void setFoto(String foto) {
        this.foto = foto;
    }

    public int getTelefono() {
        return telefono;
    }

    public void setTelefono(int telefono) {
        this.telefono = telefono;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getComentario() {
        return comentario;
    }

    public void setComentario(String comentario) {
        this.comentario = comentario;
    }

    public long getFecha() {
        return fecha;
    }

    public void setFecha(long fecha) {
        this.fecha = fecha;
    }

    public float getValoracion() {
        return valoracion;
    }

    public void setValoracion(float valoracion) {
        this.valoracion = valoracion;
    }

}
Anuncios

Observen como se agrego el metodo toString(), el cual nos devolvera todos los datos almacenados en la clase de forma concatenada, esa es la unica accion del metodo creado. Ahora vamos a crear otra clase nueva de Java

android28

Hacemos click con el boton derecho sobre el contenedor de las clases java, como se ve en la imagen, elegimos New->Java Class y aparecera el siguiente cuadro

android29

Donde le asignaremos a Name el nombre de GeoPunto, pulsamos Ok, quedando de la siguiente forma

android30

Ahora ingresaremos el codigo para esta clase:

package com.tinchicus.mislugares;

public class GeoPunto {

    private double latitud, longitud;

    public GeoPunto(double longitud, double latitud){
        this.longitud = longitud;
        this.latitud = latitud;
    }

    @Override
    public String toString() {
        return new String("longitud: "+longitud+", latitud: "+latitud);
    }
    public double distancia(GeoPunto punto){
        final double RADIO_TIERRA = 6371000;
        double dlat = Math.toRadians(latitud - punto.latitud);
        double dlon = Math.toRadians(longitud - punto.longitud);
        double lat1 = Math.toRadians(punto.latitud);
        double lat2 = Math.toRadians(latitud);
        double a = Math.sin(dlat/2) * Math.sin(dlat/2) + 
                   Math.sin(dlon/2) * Math.sin(dlon/2) * 
                   Math.cos(lat1) * Math.cos(lat2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
        return c * RADIO_TIERRA;
    }
}

Veamos el codigo, primero declaramos dos atributos, latitud y longitud, luego pasamos al constructor y en este caso otra vez por medio del apuntador this asignaremos los nuevos valores enviados por el constructor a los atributos de la clase, luego definiremos el metodo toString(), el cual se encargara de devolver los valores de latitud y longitud contenidos en la clase por medio de un valor de cadena constante, esto gracias al new string, por ultimo definiremos un metodo llamado distancia, el cual se encargara de calcular la distancia en metros entre dos coordenadas, el metodo utilizado es el algoritmo Haversine, una vez obtenido lo retorna por medio del metodo return, tambien utilizamos varios metodos matematicos para calcular el algoritmo antes mencionado, el metodo toRadians() se encarga de convertir los valores de un angulo en grados a un valor en radianes, luego utilizamos sin() para calcular el seno de un angulo, cos() para calcular el coseno de un angulo, sqrt() para obtener la raiz cuadrada de un numero y por ultimo, atan2() el cual se encarga de convertir coordinadas rectangulares (x, y) en coordenada polar y regresa el valor de theta, necesario para nuestro algoritmo. Una vez hecho esto, volvemos hacer click con el boton derecho sobre el codigo de la clase y elegimos Generate

Anuncios
android21

Luego volvemos a seleccionar Getter and Setter

android22

Apareciendo el siguiente cuadro

android31

Volvemos a seleccionar todos los atributos y pulsamos Ok donde nos modificara el codigo fuente de la siguiente forma:

package org.example.mislugares;

public class GeoPunto {

    private double latitud, longitud;

    public GeoPunto(double longitud, double latitud){
        this.longitud = longitud;
        this.latitud = latitud;
    }

    public double getLatitud() {
        return latitud;
    }

    public void setLatitud(double latitud) {
        this.latitud = latitud;
    }

    public double getLongitud() {
        return longitud;
    }

    public void setLongitud(double longitud) {
        this.longitud = longitud;
    }

    @Override
    public String toString() {
        return new String("longitud: "+longitud+", latitud: "+latitud);
    }

    public double distancia(GeoPunto punto){
        final double RADIO_TIERRA = 6371000;
        double dlat = Math.toRadians(latitud - punto.latitud);
        double dlon = Math.toRadians(longitud - punto.longitud);
        double lat1 = Math.toRadians(punto.latitud);
        double lat2 = Math.toRadians(latitud);
        double a = Math.sin(dlat/2) * Math.sin(dlat/2) + 
                   Math.sin(dlon/2) * Math.sin(dlon/2) * 
                   Math.cos(lat1) * Math.cos(lat2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
        return c * RADIO_TIERRA;
    }
}
Anuncios

Como en la clase anterior, cuando hacemos esto se generan los metodos para poder recuperar y modificar los atributos de la clase por el resto de las clases de la app, y como se habran dado cuenta ahora el objeto creado en la clase Lugar no nos va a generar ningun error. Con todo esto hemos finalizado nuestra clase llamada GeoPunto, ahora procederemos a crear nuestra ultima clase, de vuelta hacemos click con el boton derecho sobre el contenedor donde estas las clases y elegimos New->Java Class

android08

En este caso, utilizaremos el nombre de Principal para la nueva clase

android32

Pulsamos Ok, se generara la nueva clase y procederemos a agregarle el siguiente codigo fuente:

package org.example.mislugares;

public class Principal {
    public static void main(String[] main){
        Lugar lugar = new Lugar("La cueva de Tinchicus",
        "Mercedes Sosa S/N",-64.5750594,-32.0728125,1155556666,
        "https://tinchicus.com","Un gran lugar para aprender",4);
        System.out.println("Lugar " + lugar.toString());
    }
}

Como pueden ver crearemos el metodo main(), el cual es el corazon de nuestra app y permitira el funcionamiento de la misma, creamos un objeto de la clase Lugar llamado lugar donde le enviaremos toda esa informacion mostrada, pueden usar otra data, no debe ser estrictamente esta, a medida que la vayan completando les comentara a que atributo se ira asignando y una vez terminado de crear el objeto se mostrara por medio del metodo println(), el cual no mostrara ningun mensaje en pantalla sino en la salida de Run por medio del objeto System pero lo veremos mas adelante, ahora prepararemos todo para ejecutarlo, vayamos al siguiente menu desplegable

android33

Una vez seleccionado elegimos Edit Configurations donde nos aparecera el siguiente cuadro

android34

Aca deben pulsar el signo Mas (+) en el rincon superior izquierdo

android35

Aca eligen la opcion Application, una vez seleccionado aparecera de la siguiente forma

android36
Anuncios

En este cuadro deberan completar las siguientes opciones primero modifican Name con el valor: mislugares, luego van a Main class y le ingresan el valor: com.tinchicus.mislugares.Principal, en el dominio va el elegido por ustedes, y por ultimo deben ir a Use classpath of module y ahi seleccionan: MisLugares, si queda como se ve en la imagen pueden proceder a pulsar Ok. Luego eligen Run->Run ‘mislugares’ o pulsan el boton que se ve en la siguiente imagen

android15

Entonces se va a ejecutar la app, si no tiene ningun error les deberia aparecer de la siguiente forma

android37
Anuncios

Si llegaron a obtener un resultado como se ve en la imagen anterior, felicitaciones!!! Tenemos nuestro segundo programa de Java funcional, este fue un poco mas complejo, en el sentido de utilizar metodos para compartir los atributos de las distintas clases, por medio de Getter and Setter, tambien hemos visto como utilizar el Generate -> toString() para devolver los valores de muchos atributos concatenados, tambien hemos visto algunas funciones matematicas de Java y como utilizarlas, guarden esta app porque en los proximos ejemplos vamos a volver a reutilizarlo agregandole mas metodos y funcionamientos, disculpen si no lo inclui con el post anterior pero me parecio demasiado complejo y preferi dedicarle un post solitario para poder explicarlo un poco mejor y de manera mas ordenada, explicando paso a paso con ilustraciones, espero les haya gustado y les sea util, sigueme en Twitter, Facebook o Google+ para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00