Bienvenidos sean a este post, hoy volveremos a nuestra app llamada MisLugares, les recomiendo este post para crearla y poder trabajar con la informacion que veremos en el dia de hoy sin mas preambulos comencemos con la misma.

Anuncios

Primero abramos nuestra app, una vez abierto debemos ir a la clase llamada VistaLugar y aqui agregaremos la siguiente funcion:

public void verMapa(View view){
    Uri uri;
    double lat = lugar.getPosicion().getLatitud();
    double lon = lugar.getPosicion().getLongitud();
    if (lat != 0 || lon != 0) {
        uri = Uri.parse("geo:" + lat + "," + lon);
    } else {
        uri = Uri.parse("geo:0,0?q=" + lugar.getDireccion());
    }
    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
    startActivity(intent);
}

En esta nueva funcion nos permitira ver la ubicacion del lugar por medio de alguna app instalada en el dispositivo para ver mapas, como pueden ver primero crearemos un objeto del tipo Uri, luego crearemos dos variables para asignar el valor de latitud (lat) y de longitud (lon) por medio de los metodos getPosicion()getLatitud() y getLongitud() respectivamente. Lo siguiente es un condicional if donde primero chequeara si obtuvo algun valor de latitud y longitud y lo asignara al uri para crear el texto de tipo URI y pueda ser utilizado por nuestra intencion implicita, en caso contrario creara uno en base a la direccion del lugar. Este caso sera utilizado mas adelante y es para cuando no le informamos una ubicacion geografica del lugar, salido del condicional creara la intencion para utilizar la constante ACTION_VIEW y utilizar la app prederterminada para ver el mapa, y luego el dato creado por nosotros (uri) y por ultimo ejecutamos la actividad por medio de startActivity().
Pasemos a hacer las siguientes modificaciones, en este caso van a ser en el metodo onOptionsItemSelected() y modificaremos dos cases de la siguiente forma:

case R.id.accion_compartir:
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType("text/plain");
    intent.putExtra(Intent.EXTRA_TEXT,
            lugar.getNombre()+ " - " + lugar.getUrl());
    startActivity(intent);
    return true;

case R.id.accion_llegar:
    verMapa(null);
    return true;

El primer case va a ser para utilizar la accion de compartir, como pueden ver primero creamos la intencion y utilizamos la constante ACTION_SEND, luego especificamos el tipo por medio del metodo setType() para decirle que va a ser texto plano, luego por medio de un putExtra() enviaremos el nombre y la url del lugar, la siguiente linea inicia la actividad, en el siguiente case sera para la accion llegar, en este caso la unica modificacion sera para llamar al metodo creado previamente (verMapa) una vez realizada todas las modificaciones veamos como queda el codigo de la clase VistaLugar:

package org.example.mislugares;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.RatingBar;
import android.widget.TextView;

import org.w3c.dom.Text;

import java.text.DateFormat;
import java.util.Date;

public class VistaLugar extends AppCompatActivity {
    private long id;
    private Lugar lugar;

    @Override
    protected void onCreate(Bundle savedInstancestate){
        super.onCreate(savedInstancestate);
        setContentView(R.layout.vista_lugar);
        Bundle extras = getIntent().getExtras();
        id = extras.getLong("id", -1);
        lugar = Lugares.elemento((int) id);
        actualizarVistas();
    }

    public void actualizarVistas(){
        TextView nombre = (TextView) findViewById(R.id.nombre);
        nombre.setText(lugar.getNombre());
        ImageView logo_tipo = (ImageView) findViewById(R.id.logo_tipo);
        logo_tipo.setImageResource(lugar.getTipo().getRecurso());
        TextView tipo = (TextView) findViewById(R.id.tipo);
        tipo.setText(lugar.getTipo().getTexto());
        TextView direccion = (TextView) findViewById(R.id.direccion);
        direccion.setText(lugar.getDireccion());
        TextView telefono = (TextView) findViewById(R.id.telefono);
        telefono.setText(Integer.toString(lugar.getTelefono()));
        TextView url = (TextView) findViewById(R.id.url);
        url.setText(lugar.getUrl());
        TextView comentario = (TextView) findViewById(R.id.comentario);
        comentario.setText(lugar.getComentario());
        TextView fecha = (TextView) findViewById(R.id.fecha);
        fecha.setText(DateFormat.getDateInstance().format(
                new Date(lugar.getFecha())));
        TextView hora = (TextView) findViewById(R.id.hora);
        hora.setText(DateFormat.getTimeInstance().format(
                new Date(lugar.getFecha())));
        RatingBar valoracion=(RatingBar) findViewById(R.id.valoracion);
        valoracion.setRating(lugar.getValoracion());
        valoracion.setOnRatingBarChangeListener(
                new RatingBar.OnRatingBarChangeListener() {
                    @Override
                    public void onRatingChanged(RatingBar ratingBar,
                                          float valor, boolean fromUser) {
                        lugar.setValoracion(valor);
                    }
                }
        );
    }

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

    public void lanzarBorrar(){
        new AlertDialog.Builder(this)
                .setTitle("Borrado de lugar")
                .setMessage("Estas seguro de querer eliminar este lugar?")
                .setPositiveButton("Ok",
                        new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog,
                                        int cualBoton) {
                        Lugares.borrar((int) id);
                        finish();
                    }
                })
                .setNegativeButton("Cancelar", null)
                .show();
    }

    public void lanzarEditarLugar(View view){
        Intent i = new Intent(VistaLugar.this,
                EdicionLugar.class);
        i.putExtra("id", id);
        startActivityForResult(i,1234);
    }

    public void onActivityResult(int requestCode, int resultCode, 
                                 Intent data){
        if (requestCode==1234){
            actualizarVistas();
            findViewById(R.id.scrollView1).invalidate();
        }
    }

    public boolean onOptionsItemSelected(MenuItem item){
        switch(item.getItemId()){
            case R.id.accion_compartir:
                Intent intent = new Intent(Intent.ACTION_SEND);
                intent.setType("text/plain");
                intent.putExtra(Intent.EXTRA_TEXT,
                        lugar.getNombre()+ " - " + lugar.getUrl());
                startActivity(intent);
                return true;

            case R.id.accion_llegar:
                verMapa(null);
                return true;

            case R.id.accion_borrar:
                lanzarBorrar();
                return true;

            case R.id.accion_editar:
                lanzarEditarLugar(null);
                return true;

            default:
                return super.onOptionsItemSelected(item);

        }
    }

    public void verMapa(View view){
        Uri uri;
        double lat = lugar.getPosicion().getLatitud();
        double lon = lugar.getPosicion().getLongitud();
        if (lat != 0 || lon != 0) {
            uri = Uri.parse("geo:" + lat + "," + lon);
        } else {
            uri = Uri.parse("geo:0,0?q=" + lugar.getDireccion());
        }
        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
        startActivity(intent);
    }
}

Asi es como quedo el codigo final de nuestra clase, ahora si procedamos a probar nuestra app como se ve en el siguiente video

Anuncios

Como pueden ver en el video, al seleccionar uno de los lugares e ingresar ahora podemos utilizar los dos botones de la barra de acciones, como pueden ver al seleccionarlos el sistema se encargara de ejecutar la app relacionada, en el caso de la accion llegar, como no tenemos mas que una app la ejecuta directamente pero en el caso de compartir tenemos dos y aqui nos pregunta cual deseamos seleccionar y en el caso de compartir vemos tambien como envia el nombre y la direccion url del lugar, ahora vamos a hacer las ultimas modificaciones en nuestra app, para ello volvamos a nuestra clase VistaLugar y agreguemos los siguientes metodos:

public void llamadaTelefono(View view){
    startActivity(new Intent(Intent.ACTION_DIAL,
            Uri.parse("tel:" + lugar.getTelefono())));
}

public void paginaWeb(View view){
    startActivity(new Intent(Intent.ACTION_VIEW,
            Uri.parse(lugar.getUrl())));
}

El primer metodo sera para utilizar la llamada de telefono, el dato lo obtiene a traves del metodo getTelefono(), el segundo metodo es para mostar la pagina Web del lugar obteniendola por medio del metodo getUrl() y como pueden ver utilizamos las constantes respectivas para que el sistema se encargue de llamar a las apps asignadas para estas actividades, ahora veamos el codigo final de nuestra clase:

package org.example.mislugares;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.RatingBar;
import android.widget.TextView;

import org.w3c.dom.Text;

import java.text.DateFormat;
import java.util.Date;

public class VistaLugar extends AppCompatActivity {
    private long id;
    private Lugar lugar;

    @Override
    protected void onCreate(Bundle savedInstancestate){
        super.onCreate(savedInstancestate);
        setContentView(R.layout.vista_lugar);
        Bundle extras = getIntent().getExtras();
        id = extras.getLong("id", -1);
        lugar = Lugares.elemento((int) id);
        actualizarVistas();
    }

    public void actualizarVistas(){
        TextView nombre = (TextView) findViewById(R.id.nombre);
        nombre.setText(lugar.getNombre());
        ImageView logo_tipo = (ImageView) findViewById(R.id.logo_tipo);
        logo_tipo.setImageResource(lugar.getTipo().getRecurso());
        TextView tipo = (TextView) findViewById(R.id.tipo);
        tipo.setText(lugar.getTipo().getTexto());
        TextView direccion = (TextView) findViewById(R.id.direccion);
        direccion.setText(lugar.getDireccion());
        TextView telefono = (TextView) findViewById(R.id.telefono);
        telefono.setText(Integer.toString(lugar.getTelefono()));
        TextView url = (TextView) findViewById(R.id.url);
        url.setText(lugar.getUrl());
        TextView comentario = (TextView) findViewById(R.id.comentario);
        comentario.setText(lugar.getComentario());
        TextView fecha = (TextView) findViewById(R.id.fecha);
        fecha.setText(DateFormat.getDateInstance().format(
                new Date(lugar.getFecha())));
        TextView hora = (TextView) findViewById(R.id.hora);
        hora.setText(DateFormat.getTimeInstance().format(
                new Date(lugar.getFecha())));
        RatingBar valoracion=(RatingBar) findViewById(R.id.valoracion);
        valoracion.setRating(lugar.getValoracion());
        valoracion.setOnRatingBarChangeListener(
                new RatingBar.OnRatingBarChangeListener() {
                    @Override
                    public void onRatingChanged(RatingBar ratingBar,
                                         float valor, boolean fromUser) {
                        lugar.setValoracion(valor);
                    }
                }
        );
    }

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

    public void lanzarBorrar(){
        new AlertDialog.Builder(this)
                .setTitle("Borrado de lugar")
                .setMessage("Estas seguro de querer eliminar este lugar?")
                .setPositiveButton("Ok",
                        new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog,
                                        int cualBoton) {
                        Lugares.borrar((int) id);
                        finish();
                    }
                })
                .setNegativeButton("Cancelar", null)
                .show();
    }

    public void lanzarEditarLugar(View view){
        Intent i = new Intent(VistaLugar.this,
                EdicionLugar.class);
        i.putExtra("id", id);
        startActivityForResult(i,1234);
    }

    public void onActivityResult(int requestCode, int resultCode,
                                 Intent data){
        if (requestCode==1234){
            actualizarVistas();
            findViewById(R.id.scrollView1).invalidate();
        }
    }

    public boolean onOptionsItemSelected(MenuItem item){
        switch(item.getItemId()){
            case R.id.accion_compartir:
                Intent intent = new Intent(Intent.ACTION_SEND);
                intent.setType("text/plain");
                intent.putExtra(Intent.EXTRA_TEXT,
                        lugar.getNombre()+ " - " + lugar.getUrl());
                startActivity(intent);
                return true;

            case R.id.accion_llegar:
                verMapa(null);
                return true;

            case R.id.accion_borrar:
                lanzarBorrar();
                return true;

            case R.id.accion_editar:
                lanzarEditarLugar(null);
                return true;

            default:
                return super.onOptionsItemSelected(item);

        }
    }

    public void verMapa(View view){
        Uri uri;
        double lat = lugar.getPosicion().getLatitud();
        double lon = lugar.getPosicion().getLongitud();
        if (lat != 0 || lon != 0) {
            uri = Uri.parse("geo:" + lat + "," + lon);
        } else {
            uri = Uri.parse("geo:0,0?q=" + lugar.getDireccion());
        }
        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
        startActivity(intent);
    }

    public void llamadaTelefono(View view){
        startActivity(new Intent(Intent.ACTION_DIAL,
                Uri.parse("tel:" + lugar.getTelefono())));
    }

    public void paginaWeb(View view){
        startActivity(new Intent(Intent.ACTION_VIEW,
                Uri.parse(lugar.getUrl())));
    }
}
Anuncios

Con estas modificaciones realizadas ahora pasemos a la siguiente modificacion, en este caso va a ser sobre nuestro layout llamada vista_lugar.xml para agregar unos eventos del tipo listener y ser utilizados para accionarse al realizarse el evento click sobre un elemento para ello debemos ir a los LinearLayout de tres elementos, el primero va a ser direccion, el siguiente telefono y el ultimo la pagina web, veamos el primer caso:

<LinearLayout
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:orientation="horizontal"
     android:onClick="verMapa">
    <ImageView
         android:src="@android:drawable/ic_menu_myplaces"
         android:layout_width="match_parent"
         android:layout_height="wrap_content" />
    <TextView
         android:id="@+id/direccion"
         android:layout_gravity="center"
         android:layout_width="match_parent"
         android:layout_height="wrap_content" />
</LinearLayout>

Este es el bloque encargado de mostrar el icono y la direccion del lugar, dentro del bloque LinearLayout agregaremos la siguiente linea:

android:onClick="verMapa"

La cual se encargara de estar atenta ante el evento click sobre ella para ejecutar el metodo llamado verMapa() y en base a la direccion informada mostrarla en el mapa, con el condicional que vimos cuando hicimos el metodo en la clase VistaLugar, ahora deberiamos hacer lo misma para el encargado del telefono:

<LinearLayout
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:orientation="horizontal"
     android:onClick="llamadaTelefono">
    <ImageView
         android:src="@android:drawable/ic_menu_call"
         android:layout_width="match_parent"
         android:layout_height="wrap_content" />
    <TextView
         android:id="@+id/telefono"
         android:layout_gravity="center"
         android:layout_width="match_parent"
         android:layout_height="wrap_content" />
</LinearLayout>

y por ultimo para la pagina web del lugar:

<LinearLayout
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:orientation="horizontal"
     android:onClick="paginaWeb">
    <ImageView
         android:src="@android:drawable/ic_menu_mapmode"
         android:layout_width="match_parent"
         android:layout_height="wrap_content" />
    <TextView
         android:id="@+id/url"
         android:layout_gravity="center"
         android:layout_width="match_parent"
         android:layout_height="wrap_content" />
</LinearLayout>
Anuncios

Como pueden ver en ambos casos solo agregamos una nueva linea en cada uno de los bloques, la cual es la antes mencionada pero en estos dos casos les asignamos los dos ultimos metodos creados, ahora veamos el codigo final:

<?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:id="@+id/scrollView1">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/nombre"
            android:layout_gravity="center_vertical"
            android:gravity="center"
            android:text="@string/vista_nombre"
            android:textAppearance="?android:attr/textAppearanceLarge" />
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <ImageView
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:id="@+id/logo_tipo"
                android:contentDescription="@string/vista_logo"
                android:src="@drawable/otros" />
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/tipo"
                android:layout_gravity="center"
                android:textAppearance="?android:attr/textAppearanceMedium"
                android:text="@string/vista_lugar" />
        </LinearLayout>
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:onClick="verMapa">
            <ImageView
                android:src="@android:drawable/ic_menu_myplaces"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
            <TextView
                android:id="@+id/direccion"
                android:layout_gravity="center"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </LinearLayout>
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:onClick="llamadaTelefono">
            <ImageView
                android:src="@android:drawable/ic_menu_call"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
            <TextView
                android:id="@+id/telefono"
                android:layout_gravity="center"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </LinearLayout>
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:onClick="paginaWeb">
            <ImageView
                android:src="@android:drawable/ic_menu_mapmode"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
            <TextView
                android:id="@+id/url"
                android:layout_gravity="center"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </LinearLayout>
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <ImageView
                android:src="@android:drawable/ic_menu_info_details"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
            <TextView
                android:id="@+id/comentario"
                android:layout_gravity="center"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </LinearLayout>
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <ImageView
                android:src="@android:drawable/ic_menu_my_calendar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
            <TextView
                android:id="@+id/fecha"
                android:layout_gravity="center"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </LinearLayout>
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <ImageView
                android:src="@android:drawable/ic_menu_recent_history"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
            <TextView
                android:id="@+id/hora"
                android:layout_gravity="center"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </LinearLayout>
        <RatingBar
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/valoracion"
            android:layout_gravity="center_horizontal"
            android:layout_toRightOf="@+id/foto"
            android:rating="3" />
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <ImageView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/foto"
                android:adjustViewBounds="true"
                android:contentDescription="@string/vista_foto"
                android:src="@drawable/fondo_cerro"/>
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="right">
                <ImageView
                    android:layout_width="40dp"
                    android:layout_height="40dp"
                    android:contentDescription="@string/vista_camara"
                    android:src="@android:drawable/ic_menu_camera"/>
                <ImageView
                    android:layout_width="40dp"
                    android:layout_height="40dp"
                    android:contentDescription="@string/vista_galeria"
                    android:src="@android:drawable/ic_menu_gallery"/>
            </LinearLayout>
        </FrameLayout>
    </LinearLayout>
</ScrollView>

Con todas estas modificaciones realizadas ahora solo nos resta probar nuestra app, veamos el siguiente video

Como pueden ver en el video, con cada actividad ejecutada, en este caso la direccion, el telefono y la pagina web, se ejecuta una intencion implicita donde el sistema ejecutara las aplicaciones relacionadas a las actividades, y como a diferencia del post anterior en el caso de la llamada no necesitamos autorizarla porque en vez de ejecutar la accion llamamos a la aplicacion que esta autorizada.

Anuncios

En resumen, hoy hemos modificado nuestra app MisLugares para ejecutar mas acciones, hemos visto como se crean y trabajan las intenciones implicitas, espero les haya gustados, puedes seguirme 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