Bienvenidos sean a este post, hoy modificaremos la vista creada con la app en este post, es decir edicion_lugar.xml, ahora le agregaremos su verdadera funcionalidad e indagaremos un poco mas sobre otras cosas pero dejemos el preambulo y pasemos a la accion.

Anuncios

Abramos nuestro proyecto llamado MisLugares, ahora vamos a proceder a crear nuestra clase para el layout antes mencionado para eso vamos a hacer click con el boton derecho sobre el recurso contenedor de las clases, ahi seleccionaremos New -> Java class como se ve en la siguiente imagen

android38

Una vez seleccionado nos aparecera el siguiente cuadro

android39

Aca completaremos el campo Name con EdicionLugar y luego dejaremos todo como se ve, pulsamos Ok se cerrara el cuadro y se generara el archivo, quedando de la siguiente forma

android40

Ahora vamos a modificar este archivo nuevo, este es su codigo fuente actual:

package org.example.mislugares;

public class EdicionLugar {
}

Y lo modificaremos por este:

package org.example.mislugares;

import android.app.Activity;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.Spinner;


public class EdicionLugar extends Activity {
    private long id;
    private Lugar lugar;
    private EditText nombre;
    private Spinner tipo;
    private EditText direccion;
    private EditText telefono;
    private EditText url;
    private EditText comentario;

    @Override
    protected void onCreate(Bundle savedInstancestate){
        super.onCreate(savedInstancestate);
        setContentView(R.layout.edicion_lugar);
        Bundle extras = getIntent().getExtras();
        id = extras.getLong("id", -1);
        lugar = Lugares.elemento((int) id);
        nombre = (EditText) findViewById(R.id.nombre);
        nombre.setText(lugar.getNombre());
        direccion = (EditText) findViewById(R.id.direccion);
        direccion.setText(lugar.getDireccion());
        telefono = (EditText) findViewById(R.id.telefono);
        telefono.setText(Integer.toString(lugar.getTelefono()));
        url = (EditText) findViewById(R.id.web);
        url.setText(lugar.getUrl());
        comentario = (EditText) findViewById(R.id.notas);
        comentario.setText(lugar.getComentario());
    }
}

Como pueden ver declaramos una serie de vinculos entre los elementos del archivo edicion_lugar.xml:

private EditText nombre;
private Spinner tipo;
private EditText direccion;
private EditText telefono;
private EditText url;
private EditText comentario;

Como pueden ver agregamos un tipo llamado Spinner pero por ahora no lo configuraremos solamente lo declararemos, pero como pueden ver van a relacionarse con nuestros elementos, veamos una de las tantas lineas que permiten el vinculo entre el elemento del XML y el codigo Java:

url = (EditText) findViewById(R.id.web);

Como pueden ver utilizamos el objeto declarado, luego volvemos a definir el elemento (EditText) y por medio del metodo findViewById() le diremos la ubicacion del elemento, en este caso R.id.web, esto se encargara de asignar el elemento web a url, en la siguiente linea veremos su accion:

url.setText(lugar.getUrl());
Anuncios

Aca le seteamos el texto a este elemento por medio del metodo getUrl() del objeto lugar creado de la clase Lugar. En estas dos lineas nos encargaremos de asignar la informacion del lugar a cada uno de los elementos para poder verlos y modificarlos, como se ve en la siguiente imagen

android41

Pero para lograr esto debemos hacer algunas modificaciones extras, vamos a ver las mismas. Nuestro primer cambio va a ser la declaracion de la nueva actividad. Para eso vamos a AndroidManifest.xml y procedemos a editarla, veamos el codigo fuente actual:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="org.example.mislugares">

    <application
         android:allowBackup="true"
         android:icon="@mipmap/ic_launcher"
         android:label="@string/app_name"
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
         android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category
                     android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".AcercaDe"
             android:label="Acerca De..."
             android:theme="@android:style/Theme.Dialog" />
        <activity android:name=".VistaLugar"
             android:label="@string/menu_buscar" />
    </application>

</manifest>

Y aca le agregaremos la nueva actividad:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="org.example.mislugares">

    <application
         android:allowBackup="true"
         android:icon="@mipmap/ic_launcher"
         android:label="@string/app_name"
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
         android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                
            </intent-filter>
        </activity>
        <activity android:name=".AcercaDe"
             android:label="Acerca De..."
             android:theme="@android:style/Theme.Dialog" />
        <activity android:name=".VistaLugar"
             android:label="@string/menu_buscar" />
        <activity android:name=".EdicionLugar"
             android:label="Editar" />
    </application>

</manifest>

Como pueden ver la diferencia va a estar en el ultimo activity donde declararemos a la nueva clase creada (EdicionLugar). Ahora vamos a pasar a la clase VistaLugar para hacer la ultima modificacion de nuestra app para finalmente poder probarla.
Vayamos a la clase VistaLugar, tendremos el siguiente codigo:

package org.example.mislugares;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
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);
        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 boolean onOptionsItemSelected(MenuItem item){
        switch(item.getItemId()){
            case R.id.accion_compartir:
                return true;

            case R.id.accion_llegar:
                return true;

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

            case R.id.accion_editar:
                return true;

            default:
                return super.onOptionsItemSelected(item);

        }
    }
}

Y ahora lo modificaremos para agregar un metodo y una modificacion dentro del metodo que verifica los opciones seleccionadas de la barra:

package org.example.mislugares;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
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);
        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);
        startActivity(i);
    }

    public boolean onOptionsItemSelected(MenuItem item){
        switch(item.getItemId()){
            case R.id.accion_compartir:
                return true;

            case R.id.accion_llegar:
                return true;

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

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

            default:
                return super.onOptionsItemSelected(item);

        }
    }
}
Anuncios

Comencemos a analizar nuestro nuevo codigo, primero veamos el nuevo metodo:

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

En este bloque crearemos nuestra actividad para poder invocar a nuestra clase para la edicion del lugar, como pueden ver es como todos los visto hasta ahora primero creamos un objeto de Intent para decirle cual es la clase autilizar, luego le enviamos informacion por medio del putExtra(), en este caso el id del lugar, y por ultimo iniciamos la actividad. Ahora pasemos a la modificacion del condicional:

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

Como pueden ver solamente le hacemos referencia a que cuando se ha elegido Editar debe lanzar el metodo comentado anteriormente, si todo sale bien deberan tener una salida como se ve en el siguiente video

Como pueden ver esta a un 50% funcional solo nos falta un par de detalles, entre ellos el Spinner y los botones para guardar nuestros cambios empecemos con el Spinner. Primero comencemos modificando nuestra clase llamada TipoLugar, veamos el codigo actual:

package org.example.mislugares;

public enum TipoLugar {
    OTROS ("Otros", R.drawable.otros),
    RESTAURANTE ("Restaurante", R.drawable.restaurante),
    BAR ("Bar", R.drawable.bar),
    COPAS ("Copas", R.drawable.copas),
    ESPECTACULO ("Espectaculo", R.drawable.espectaculos),
    HOTEL ("Hotel", R.drawable.hotel),
    COMPRAS ("Compras", R.drawable.compras),
    EDUCACION ("Educacion", R.drawable.educacion),
    DEPORTE ("Deporte", R.drawable.deporte),
    NATURALEZA ("Naturaleza", R.drawable.naturaleza),
    GASOLINERA ("Gasolinera", R.drawable.gasolinera);

    private final String texto;
    private final int recurso;

    TipoLugar (String texto, int recurso){
        this.texto = texto;
        this.recurso = recurso;
    }

    public String getTexto() { return texto; }
    public int getRecurso() { return recurso; }
}

Ahora procederemos a modificarlo para agregar el siguiente metodo:

package org.example.mislugares;

public enum TipoLugar {
    OTROS ("Otros", R.drawable.otros),
    RESTAURANTE ("Restaurante", R.drawable.restaurante),
    BAR ("Bar", R.drawable.bar),
    COPAS ("Copas", R.drawable.copas),
    ESPECTACULO ("Espectaculo", R.drawable.espectaculos),
    HOTEL ("Hotel", R.drawable.hotel),
    COMPRAS ("Compras", R.drawable.compras),
    EDUCACION ("Educacion", R.drawable.educacion),
    DEPORTE ("Deporte", R.drawable.deporte),
    NATURALEZA ("Naturaleza", R.drawable.naturaleza),
    GASOLINERA ("Gasolinera", R.drawable.gasolinera);

    private final String texto;
    private final int recurso;

    TipoLugar (String texto, int recurso){
        this.texto = texto;
        this.recurso = recurso;
    }

    public static String[] getNombre(){
        String[] resultado = new String[TipoLugar.values().length];
        for(TipoLugar tipo: TipoLugar.values()){
            resultado[tipo.ordinal()] = tipo.getTexto();
        }
        return resultado;
    }

    public String getTexto() { return texto; }
    public int getRecurso() { return recurso; }
}

Vamos a analizar el nuevo metodo:

public static String[] getNombre(){
    String[] resultado = new String[TipoLugar.values().length];
    for(TipoLugar tipo: TipoLugar.values()){
        resultado[tipo.ordinal()] = tipo.getTexto();
    }
    return resultado;
}

En este caso va a ser para recuperar todos los nombres del recurso en cuestion, como pueden ver primero creamos un variable de tipo String llamada resultado, la cual sera un tipo Array y el tamaño estara definido por la cantidad de elementos del ENUM llamado TipoLugar, luego utilizaremos un bucle for() para acceder a todos los valores y guardaremos en el array resultado cada uno de los textos con su respectiva posicion, una vez creado y almacenado salimos del bucle y devolvemos el valor creado por medio de la linea: return resultado; Ahora procedamos a la modificacion de la clase EdicionLugar para agregar a nuestro elemento llamado tipo dentro del metodo onCreate():

Anuncios
package org.example.mislugares;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;


public class EdicionLugar extends Activity {
    private long id;
    private Lugar lugar;
    private EditText nombre;
    private Spinner tipo;
    private EditText direccion;
    private EditText telefono;
    private EditText url;
    private EditText comentario;

    @Override
    protected void onCreate(Bundle savedInstancestate){
        super.onCreate(savedInstancestate);
        setContentView(R.layout.edicion_lugar);
        Bundle extras = getIntent().getExtras();
        id = extras.getLong("id", -1);
        lugar = Lugares.elemento((int) id);
        nombre = (EditText) findViewById(R.id.nombre);
        nombre.setText(lugar.getNombre());
        direccion = (EditText) findViewById(R.id.direccion);
        direccion.setText(lugar.getDireccion());
        telefono = (EditText) findViewById(R.id.telefono);
        telefono.setText(Integer.toString(lugar.getTelefono()));
        url = (EditText) findViewById(R.id.web);
        url.setText(lugar.getUrl());
        comentario = (EditText) findViewById(R.id.notas);
        comentario.setText(lugar.getComentario());
        tipo = (Spinner) findViewById(R.id.tipo);
        ArrayAdapter adaptador = new ArrayAdapter(
                this, android.R.layout.simple_spinner_item,
                TipoLugar.getNombre());
        adaptador.setDropDownViewResource(android.R.layout.
                simple_spinner_item);
        tipo.setAdapter(adaptador);
        tipo.setSelection(lugar.getTipo().ordinal());
    }
}

En este nuevo codigo agregaremos las siguientes nuevas lineas:

tipo = (Spinner) findViewById(R.id.tipo);
ArrayAdapter adaptador = new ArrayAdapter(
        this, android.R.layout.simple_spinner_item,
        TipoLugar.getNombre());
adaptador.setDropDownViewResource(android.R.layout.
        simple_spinner_item);
tipo.setAdapter(adaptador);
tipo.setSelection(lugar.getTipo().ordinal());

Primero le asignaremos a tipo el elemento del archivo XML, luego crearemos un Array de tipo adapter, no se preocupen lo veremos mas adelante en otro post, pero basicamente es crear un array vinculado a un elemento spinner y por ultimo utilizar el metodo creado anteriormente para obtener el listado de los nombres de los tipos disponibles, despues agregara la propiedad para crear un menu desplegable vinculado al elemento creado en la linea anterior, despues definira el adapter y en este caso va a ser el creado por nosotros, adaptador, y la ultima linea se encargara de usar como seleccion al tipo seleccionado. Con esto ya dejamos funcionando el spinner ahora solo nos falta la barra de acciones para poder guardar los cambios empecemos con la misma, como siempre click con el boton derecho sobre el recursos menu y seleccionan New -> Menu resource file como se ve en la siguiente imagen

android42

Una vez seleccionado aparecera el siguiente cuadro

android43

Aca deben completar el campo File Name con menu_edicion_lugar y el resto dejarlo como se ve, pulsan Ok y se generara el nuevo archivo, quedando como se ve en la siguiente imagen

android44

Ahora antes de comenzar a trabajar con el nuevo archivo vamos a modificar al archivo strings.xml para poder agregar los titulos de nuestros futuros elementos del menu, veamos el codigo actual:

Anuncios
<resources>
    <string name="app_name">Mis Lugares</string>
    <string name="menu_conf">Configuracion</string>
    <string name="menu_about">Acerca De...</string>
    <string name="menu_buscar">Buscar</string>
    <string name="vista_nombre">Nombre del Lugar</string>
    <string name="vista_lugar">Tipo del Lugar</string>
    <string name="vista_logo">Logo del tipo</string>
    <string name="vista_foto">Fotografia</string>
    <string name="vista_camara">Logo camara</string>
    <string name="vista_galeria">Logo galeria</string>
    <string name="menvst_compartir">Compartir</string>
    <string name="menvst_llegar">Como llegar</string>
    <string name="menvst_editar">Editar</string>
    <string name="menvst_borrar">Borrar</string>
</resources>

Procedamos las nuevas lineas para almacenar los nuevos titulos:

<resources>
    <string name="app_name">Mis Lugares</string>
    <string name="menu_conf">Configuracion</string>
    <string name="menu_about">Acerca De...</string>
    <string name="menu_buscar">Buscar</string>
    <string name="vista_nombre">Nombre del Lugar</string>
    <string name="vista_lugar">Tipo del Lugar</string>
    <string name="vista_logo">Logo del tipo</string>
    <string name="vista_foto">Fotografia</string>
    <string name="vista_camara">Logo camara</string>
    <string name="vista_galeria">Logo galeria</string>
    <string name="menvst_compartir">Compartir</string>
    <string name="menvst_llegar">Como llegar</string>
    <string name="menvst_editar">Editar</string>
    <string name="menvst_borrar">Borrar</string>
    <string name="menedt_guardar">Guardar</string>
    <string name="menedt_cancelar">Cancelar</string>
</resources>

Como pueden ver agregamos las dos lineas (menedt_guardar y menedt_cancelar)  para rotular nuestros nuevos elementos, ahora si procedamos a modificar el archivo menu_edicion_lugar.xml, veamos su codigo actual:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

</menu>

Ahora vamos a proceder con el cambio del codigo para agregar los nuevos elementos:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/accion_cancelar"
         android:title="@string/menedt_cancelar"
         android:orderInCategory="10"
         app:showAsAction="ifRoom" />
    <item android:id="@+id/accion_guardar"
         android:title="@string/menedt_guardar"
         android:orderInCategory="20"
         app:showAsAction="ifRoom" />
</menu>

Como pueden ver agregamos dos items y como no le identificamos con ningun icono se mostrara el titulo asignado en la propiedad android:title, ahora procederemos a crear los metodos para poder cargar nuestra barra y poder asignarles las acciones pertinentes, vamos a ver el codigo modificado de nuestra clase EdicionLugar:

package org.example.mislugares;

import android.app.Activity;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;


public class EdicionLugar extends AppCompatActivity {
    private long id;
    private Lugar lugar;
    private EditText nombre;
    private Spinner tipo;
    private EditText direccion;
    private EditText telefono;
    private EditText url;
    private EditText comentario;

    @Override
    protected void onCreate(Bundle savedInstancestate){
        super.onCreate(savedInstancestate);
        setContentView(R.layout.edicion_lugar);
        Bundle extras = getIntent().getExtras();
        id = extras.getLong("id", -1);
        lugar = Lugares.elemento((int) id);
        nombre = (EditText) findViewById(R.id.nombre);
        nombre.setText(lugar.getNombre());
        direccion = (EditText) findViewById(R.id.direccion);
        direccion.setText(lugar.getDireccion());
        telefono = (EditText) findViewById(R.id.telefono);
        telefono.setText(Integer.toString(lugar.getTelefono()));
        url = (EditText) findViewById(R.id.web);
        url.setText(lugar.getUrl());
        comentario = (EditText) findViewById(R.id.notas);
        comentario.setText(lugar.getComentario());
        tipo = (Spinner) findViewById(R.id.tipo);
        ArrayAdapter adaptador = new ArrayAdapter(
                this, android.R.layout.simple_spinner_item,
                TipoLugar.getNombre());
        adaptador.setDropDownViewResource(android.R.layout.
                simple_spinner_item);
        tipo.setAdapter(adaptador);
        tipo.setSelection(lugar.getTipo().ordinal());
    }

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

    public void guardar(){
        lugar.setNombre(nombre.getText().toString());
        lugar.setTipo(TipoLugar.values()[tipo.getSelectedItemPosition()]);
        lugar.setDireccion(direccion.getText().toString());
        lugar.setTelefono(Integer.parseInt(telefono.getText().toString()));
        lugar.setUrl(url.getText().toString());
        lugar.setComentario(comentario.getText().toString());
        finish();
    }

    public boolean onOptionsItemSelected(MenuItem item){
        int id = item.getItemId();
        if (id == R.id.accion_cancelar){
            finish();
            return true;
        }

        if (id == R.id.accion_guardar){
            guardar();
        }
        return super.onOptionsItemSelected(item);
    }

}

Aca vamos a hacer algunas modificaciones, la primera va a ser la siguiente linea:

public class EdicionLugar extends Activity

La modificaremos por esta:

public class EdicionLugar extends AppCompatActivity

Esta linea nos permitira cargar el contenido de la barra por medio del siguiente metodo:

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

Este metodo solo se encarga de cargar la barra creada en el archivo menu_edicion_lugar.xml ahora veamos el siguiente metodo encargado de la accion de guardar:

public void guardar(){
    lugar.setNombre(nombre.getText().toString());
    lugar.setTipo(TipoLugar.values()[tipo.getSelectedItemPosition()]);
    lugar.setDireccion(direccion.getText().toString());
    lugar.setTelefono(Integer.parseInt(telefono.getText().toString()));
    lugar.setUrl(url.getText().toString());
    lugar.setComentario(comentario.getText().toString());
    finish();
}

Este tiene un poco mas de complejidad pero no mucho mas, cada linea se encargara de setear los nuevos valores modificados en la vista, y por ultimo cerrara nuestra vista por medio del metodo finish(). Ahora vamos a ver la ultima modificacion en el siguiente metodo para poder capturar los elementos seleccionados de la barra de acciones:

public boolean onOptionsItemSelected(MenuItem item){
    int id = item.getItemId();
    if (id == R.id.accion_cancelar){
        finish();
        return true;
    }

    if (id == R.id.accion_guardar){
        guardar();
    }
    return super.onOptionsItemSelected(item);
}

Aca crearemos una variable de tipo entera llamada id y por medio del metodo getItemId() conseguiremos el valor del id del elemento, y despues por medio de dos condicionales if seleccionaremos si elegimos cancelar o guardar, si la opcion es coincidente con el boton de cancelar ejecutara el metodo finish() donde no hara ninguna accion cerrando la vista, en cambio si la opcion coincide con el boton de guardar, llamara al metodo anteriormente explicado y realizara los cambios, veamos como trabaja en el siguiente video

Anuncios

Si observan el video, hacemos todos los pasos necesarios para modificarlo pero no lo hace automaticamente porque para ver los cambios debemos retroceder al principio para refrescar nuestra vista con los respectivos cambios, para lograr la modificacion automatica debemos hacer una serie de modificaciones las cuales detallaremos a continuacion.
Primero debemos ir a la clase VistaLugar donde agregaremos un nuevo metodo pero primero veamos su codigo actual:

package org.example.mislugares;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
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);
        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);
        startActivity(i);
    }

    public boolean onOptionsItemSelected(MenuItem item){
        switch(item.getItemId()){
            case R.id.accion_compartir:
                return true;

            case R.id.accion_llegar:
                return true;

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

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

            default:
                return super.onOptionsItemSelected(item);
        }
    }
}

Ahora agregaremos un metodo nuevo y haremos dos modificaciones para que se apliquen “automaticamente” veamos el nuevo codigo:

package org.example.mislugares;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
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:
                return true;

            case R.id.accion_llegar:
                return true;

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

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

            default:
                return super.onOptionsItemSelected(item);

        }
    }
}
Anuncios

Ahora vamos a ver las pequeñas modificaciones realizadas, primero veamos el nuevo metodo creado:

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);
                }
            }
    );
}

En este caso creamos un nuevo metodo llamado actualizarVistas() y su unica funcion es la de cargar todos los datos en los elementos, para esto simplemente movimos todo el contenido ubicado en onCreate() desde TextView nombre = (TextView) findViewById(R.id.nombre); hasta la ultima linea de valoracion, esto nos permitira asignar los valores almacenados a nuestros elementos siendo esa su unica funcion y para que nuestra vista siga funcionando hicimos la siguiente modificacion en onCreate():

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();
}

Todo los procedimientos faltantes fueron reemplazados por nuestro nuevo metodo, actualizarVistas(), porque hace exactamente lo que hacia antes, ahora sigamos con la nueva modificacion:

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

Esta vez es en el metodo lanzarEditarLugar() haremos una modificacion reemplazando el startActivity(i) por startActivityForResult(i,1234), este nuevo metodo es similar al anterior pero con la diferencia de que solo se activara si tiene un resultado sin afectar la operatividad de  nuestro metodo y ahora al agregarle la opcion de iniciar una actividad pero a su vez para devolver un resultado, con este resultado en el aire pasaremos el siguiente metodo nuevo:

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

Este metodo se encargara de volver a capturar el resultado que quedo en el aire del inicio de nuestra actividad anterior, esto lo hacemos atraves de los atributos declarados en nuestro metodo, el siguiente condicional se encargara de evaluar esto, si requestCode es igual a 1234 llamara a la nueva funcion actualizarVistas() para volver a cargar los datos y por medio de la siguiente linea se reflejara el cambio porque forzamos al sistema a solicitar al scrollView a recargarse por medio del metodo invalidate(), si todo salio bien obtendremos esta app como se ve en el siguiente video

Si lograron lo mismo a lo que se ve en el video, Felicitaciones!!! Han logrado dejar una app muy operativa para consultar, borrar y editar informacion en la misma si bien todavia no esta completamente operativa si hemos logrado hacer funcionar los metodos para ejecutar esas tareas y proximamente agregaremos mas funcionalidades pero hemos dado un gran paso hacia poder generar nuestra propia app en el mundo de Android.

Anuncios

Repasemos, hoy hemos terminado una nueva vista para editar nuestros lugares, hemos creado la actividad para ejecutarlo, hemos hecho un metodo para modificarla y otro para ver la modificacion pertinente, hemos visto como enviar informacion para la busqueda y recuperacion de la data. Espero les haya sido 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