tutorial android

58
Tutorial Android + SQLite http://notasprogramacion.sodenet.es/tutorial-android-sqlite/ Cómo instalar entorno de desarrollo android 09/15/2012 12:41 3 Comentarios pmon Explicamos a continuación cómo instalar el entorno de desarrollo Android sobre Ubuntu 12.04 64-bit. No obstante, si tenéis que realizar la instalación sobre otro Sistema Operativo basta con buscar en Google, hay una infinidad de recursos a un click de distancia. Inténtalo, vale la pena!! Adjunto imagen con detalles de mi equipo Paso 1: Instalar Eclipse Basta con abrir un Terminal e instalar desde apt-get: sudo apt-get install eclipse

Upload: archivo35

Post on 03-Jan-2016

77 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Tutorial Android

Tutorial Android + SQLite

http://notasprogramacion.sodenet.es/tutorial-android-sqlite/

Cómo instalar entorno de desarrollo android09/15/2012 12:41 ⋅ 3 Comentarios ⋅ pmon

Explicamos a continuación cómo instalar el  entorno de desarrollo Android sobre Ubuntu

12.04 64-bit. No obstante, si tenéis que realizar la instalación sobre otro Sistema Operativo

basta con buscar en Google, hay una infinidad de recursos a un click de distancia. Inténtalo,

vale la pena!!

Adjunto imagen con detalles de mi equipo

Paso 1: Instalar Eclipse

Basta con abrir un Terminal e instalar desde apt-get:

sudo apt-get install eclipse

Page 2: Tutorial Android

Paso 2: Abrir Eclipse y consultar versión instalada

Abrimos Eclipse y consultamos la versión del mismo desde Help > About Eclipse Platformy

veremos una pantalla como la que sigue en la cual se indica la versión de Eclipse. En

nuestro caso 3.7

Paso 3: Instalamos los paquetes de Software desde Eclipse

Vamos a Help > Install New Software …y allí indicamos la ruta desde la que instalaremos

los paquetes necesarios. En nuestro caso indicando la versión

3.7:https://dl.google.com/eclipse/plugin/3.7

Instalamos los paquetes Developer Tools, Google Plugin for Eclipse y SDKs

Page 3: Tutorial Android

Cuando termine la instalación solicitará reiniciar eclipse.

Paso 4: Instalación automática de SDK Android

Tras el reinicio de eclipse aparecera el asistente de instalación del SDK, bastará con darle a

siguiente y finalizar la instalación.

Paso 5: Configuración de AVD

El último paso consite en configurar un dispositivo virtual Android que utilizaremos para

probar las aplicaciones sin necesidad de instalarlas en nuestro dispositivo. Para ello vamos

Page 4: Tutorial Android

a Window > AVD Managery creamos los dispositivos que necesitemos tal y como se ve en la

imagen

Una vez completados todos los pasos ya tenemos listo el entorno de desarrollo para

comenzar nuestra aplicación ….

Page 5: Tutorial Android

Hola Mundo Android12/01/2012 19:37 ⋅ 1 Comentario ⋅ pmon

 

Como no podía ser de otra forma, nuestro primer programa en Android será el típico y

archiconocido Hola Mundo.

Para ello comenzaremos por abrir nuestro IDE Eclipse para android que ya vimos como

instalar en el post anterior Instalar entorno de desarrollo Android.

Paso 1: Creamos el nuevo proyecto Android

Para quien todavía no esté familiarizado con las opciones básicas de eclipse: File – New –

Project y dentro de la carpeta Android seleccionamos Android Application Project y

pulsamos Siguiente.

Indicamos el nombre del proyecto y el resto de opciones por defecto.

Build SDK: versión del SDK con el que se va a compilar el proyecto.

Minimun Required SDK: versión mínima de Android en la que podrá ejecutarse la

aplicación.

Page 6: Tutorial Android

Pulsamos Siguiente y aparece el asistente para crear la Activity principal. Una Activity es

cada una de las pantallas que forman nuestra aplicación.

Volvemos a pulsar Siguiente con las opciones por defecto y nos lleva a la pantalla desde la

que daremos nombre a la Activity.

Explico alguno de los campos que aparecen en esta pantalla ya que darán nombre a

distintas partes del código de nuestra aplicación.

Activity Name: Nombre que recibirá la clase .java correspondiente a la Activity.

Layout Name: Nombre del xml que define los elementos visuales de la Activity.

Title: El título que se le pondrá por defecto a la Pantalla.

Page 7: Tutorial Android

Paso 2: Revisamos el código generado por el asistente

Al completar el asistente se ha creado un proyecto de ejemplo que incluye el texto Hello

World en pantalla así que lo aprovecharemos para visualizar las diferentes partes de código

del proyecto.

Page 8: Tutorial Android

o src/com.example.holamundoandroid/Inicio.java: Es la clase Inicio, en ella

incluiremos el código relacionado con la activity. Por el momento no haremos nada

con él.

o res/layout/activity_inicio.xml: Es el fichero de layout que define la visualización

de la activity. Eclipse permite trabajar sobre esta pantalla en modo gráfico o

edición l xml.

12345678910

<xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"android:layout_height="match_p

arent" ><TextView   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:layout_centerHorizontal="true"   android:layout_centerVertical="true"   android:text="@string/hello_world"   tools:context=".Inicio" />

res/values/strings.xml: En este fichero se definen las etiquetas de texto que se van a

utilizar en la aplicación. En el podéis observar que se definen tanto las etiquetas de

nombre de la aplicación, la propia etiqueta hello world y el título de la activity Inicio.

o HolaMundoAndroid

Page 9: Tutorial Android

o Hello world!

o Settings

o Inicio

Paso 3: Ejecutamos la aplicación en el AVD

Ya se explicó en la configuración del AVD en el Paso 5 de Instalación de entorno de

desarrollo Android así que si no lo tienes configurado vuelve a él.

Para ejecutarlo pulsamos sobre Run o Control + F11. Tras un tiempo de espera aparece el

emulador Android con nuestra aplicación.

Paso 4: Modificamos el código del proyecto a nuestro gusto

¿Cómo íbamos a terminar nuestro primer programa sin haber tirado ni una sola línea de

código? …. ¡¡¡Que no se diga!!! Ahora vamos a escribir un poco de código para terminar

nuestro Hola Mundo Android con un buen sabor de boca …

¿Y qué vamos a hacer?

Pondremos un campo para rellenar nuestro nombre y un botón que al pulsarlo muestre el

texto: Hola Mundo Android … saludos de xxxxxxxxxx

strings.xml: Añadimos los textos de los nuevos elementos

HolaMundoAndroid

Settings

Page 10: Tutorial Android

Inicio

Introduce tu nombre

Saluda

activity_inicio.xml: Incluimos los nuevos controles

12345678910111213141516171819202122232425262728

<xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent" ><EditTextandroid:id="@+id/nombre"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignBaseline="@+id/boton_saludar"android:layout_alignBottom="@+id/boton_saludar"android:layout_alignParentLeft="true"android:hint="@string/hint_nombre" /> <Buttonandroid:id="@+id/boton_saludar"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_alignParentTop="true"android:text="@string/texto_boton_saludar"android:onClick="saludar"/>

 <TextViewandroid:id="@+id/saludo"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_centerVertical="true" />

Prestad especial atención a la propiedad android:onClick=”saludar” del botón. Esta

propiedad desencadenará la llamada al método saludar de la clase Inicio.class

Inicio.java: Añadimos el método saludar que se encargará de recoger el valor del nombre

y rellenar el saludo en el TextView de activity_inicio.xml

1234567

package com.example.holamundoandroid;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.View;import android.widget.EditText;import android.widget.TextView; public class Inicio extends Activity {

Page 11: Tutorial Android

891011121314151617181920212223242526272829303132333435363738394041

 @Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_inicio);}

 @Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.activity_inicio, menu);return true;}

 public void saludar(View view){ // recuperamos los objetos de la visaEditText nombre = (EditText) findViewById(R.id.nombre);TextView saludo = (TextView) findViewById(R.id.saludo);

 // construimos el saludoString mensaje = "Hola Mundo Android" ; // si el nombre no está vacío lo añadimosif (nombre.getText().length() > 0){mensaje += " ... saludos de " + nombre.getText().toString() ;}

 // rellenamos el saludosaludo.setText(mensaje);}}

En el método saludar declaramos dos objetos de tipo nombre y saludo que obtenemos de la

vista mediante findViewById

Construimos después el saludo incluyendo en el texto del nombre si se ha rellenado.

Visualizamos el mensaje en el TextView.

El resultado aquí lo tenéis!!!

Page 12: Tutorial Android

 

Puedes descargar la aplicación del ejemplo desde aquí HolaMundoAndroid.apk

Page 13: Tutorial Android

Tutorial CRUD Android + SQLite (I): Crear la base de datos03/22/2013 20:15 ⋅ 2 Comentarios ⋅ pmon

Esta es la primera parte de tutorial en las que detallaremos paso a paso la creación de una

aplicación CRUD con Android + SQLite.

¿Qué es un CRUD Android + SQLite?

CRUD es el acrónimo de Create, Read, Update y Delete. Por tanto vamos a crear una

aplicación Android con las operaciones básicas para guardar y mantener información en

una base de datos SQLite:

Crear Registros

Obtener Registros

Actualizar Registros

Borrar Registros

La aplicación de ejemplo consistirá en una lista en la que introduciremos las condiciones

bancarias que nos han ofrecido en diferentes entidades para la solicitud de una hipoteca.

 

1: Nuevo Proyecto Android

No entramos en detalle para la creación de un nuevo proyecto Android. Si no tienes claro

cómo hacerlo puedes revisar la entrada anterior Hola Mundo Android.

 

2: Clase controladora de base de datos para SQLite

La creación, actualización y conexión de la base de datos se realiza desde la aplicación a

través de una clase que hereda de SqliteOpenHelper. Esta clase gestiona la creación de la

base de datos la primera vez que se accede a la misma con el método onCreate y la

actualización de la base de datos cuando se detecte un cambio de versión de la misma con

el método onUpdate. Hemos llamado a la clase HipotecaDbHelper.

Page 14: Tutorial Android

En esta clase declaramos 3 propiedades que utilizaremos en el constructor de la misma:

12345678910111213141516171819202122232425262728

package com.sodenet.hipotecas; import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper; public class HipotecaDbHelper extends SQLiteOpenHelper {    private static int version = 1;   private static String name = "HipotecaDb" ;   private static CursorFactory factory = null;    public HipotecaDbHelper(Context context)   {      super(context, name, factory, version);   }

    @Override   public void onCreate(SQLiteDatabase db)   {

    }

    @Override   public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)   {

    }}

Page 15: Tutorial Android

2930 

3: Crear tabla en SQLite

Ahora que ya tenemos la clase controladora de la base de datos vamos implementar el

método onCreate con la creación de la tabla HIPOTECA que consta de los siguientes

campos:

_id: Identificador del registro. Es importante utilizar como identificador _id ya que los

cursores que utilizaremos para recuperar la información dan por hecho que el

identificador toma este nombre.

hip_nombre: Nombre del registro. Lo utilizaremos para incluir el nombre de la

hipoteca o entidad bancaria.

hip_condiciones: Condiciones bancarias de la hipoteca.

hip_contacto: Persona con la que estamos en contacto con la entidad bancaria

hip_email: E-mail de contacto.

hip_telefono: Teléfono de contacto.

hip_observaciones: Notas referentes a la hipoteca.

123456789101112131415161718192021222324

@Overridepublic void onCreate(SQLiteDatabase db){   Log.i(this.getClass().toString(), "Creando base de datos");

    db.execSQL( "CREATE TABLE HIPOTECA(" +          " _id INTEGER PRIMARY KEY," +          " hip_nombre TEXT NOT NULL, " +          " hip_condiciones TEXT, " +          " hip_contacto TEXT," +          " hip_email TEXT," +          " hip_telefono TEXT," +          " hip_observaciones TEXT)" );    db.execSQL( "CREATE UNIQUE INDEX hip_nombre ON HIPOTECA(hip_nombre

ASC)" );    Log.i(this.getClass().toString(), "Tabla HIPOTECA creada");

    /*    * Insertamos datos iniciales    */   db.execSQL("INSERT INTO HIPOTECA(_id, hip_nombre) VALUES(1,'Santander')");   db.execSQL("INSERT INTO HIPOTECA(_id, hip_nombre) VALUES(2,'BBVA')");   db.execSQL("INSERT INTO HIPOTECA(_id, hip_nombre) VALUES(3,'La Caixa')");

Page 16: Tutorial Android

252627282930313233

   db.execSQL("INSERT INTO HIPOTECA(_id, hip_nombre) VALUES(4,'Cajamar')");   db.execSQL("INSERT INTO HIPOTECA(_id, hip_nombre) VALUES(5,'Bankia')");   db.execSQL("INSERT INTO HIPOTECA(_id, hip_nombre) VALUES(6,'Banco Sabadell')");   db.execSQL("INSERT INTO HIPOTECA(_id, hip_nombre) VALUES(7,'Banco Popular')");

    Log.i(this.getClass().toString(), "Datos iniciales HIPOTECA insertados");

    Log.i(this.getClass().toString(), "Base de datos creada");}

 

4: Abrir la base de datos SQLite desde la aplicación Android

Al iniciar nuestra aplicación abrimos la base de datos. La primera vez desencadena la

ejecución del método onCreate de nuestra clase HipotecaDbHelper. Para ello modificamos

el método onCreate de la clase de la actividad principal de la aplicación, Hipoteca.java

1234567891011121314

@Overrideprotected void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   setContentView(R.layout.activity_hipoteca);

    /*    * Declaramos el controlador de la BBDD y accedemos en modo escritura    */   HipotecaDbHelper dbHelper = new HipotecaDbHelper(getBaseContext());    SQLiteDatabase db = dbHelper.getWritableDatabase();

    Toast.makeText(getBaseContext(), "Base de datos preparada", Toast.LENGTH_LONG).show();}

 

5: Ejecución de la aplicación

¡Ya está todo listo! Ahora basta con ejecutar la aplicación en el emulador teniendo en

cuenta que se mostrará un mensaje emergente cuando la base de datos esté preparada.

Page 17: Tutorial Android

Además si revisamos el LogCat, la primera vez que se ejecute la aplicación veremos como

indica los pasos seguidos en la creación de la base de datos.

Page 18: Tutorial Android

Tutorial CRUD Android + SQLite (II): Mostrar datos en ListView03/29/2013 15:37 ⋅ 6 Comentarios ⋅ pmon

En la entrada anterior vimos la definición y creación de la base de datos SQLite para la

aplicación CRUD de ejemplo que consistía en registrar las condiciones ofrecidas por las

entidades bancarias para la solicitud de una hipoteca. En la entrada actual trataremos la

visualización de los registros de la base de datos SQLite en un componente ListView.

 

1: HipotecaDbAdapter

Definimos la clase HipotecaDbAdapter para gestionar las operaciones de la entidad

HIPOTECA en la base de datos SQLite.

12345678910111213

package com.sodenet.hipotecas; import android.content.Context;import android.database.Cursor;import android.database.SQLException;import android.database.sqlite.SQLiteDatabase; public class HipotecaDbAdapter {    /**    * Definimos constante con el nombre de la tabla    */   public static final String C_TABLA = "HIPOTECA" ;    /**

Page 19: Tutorial Android

1415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960

    * Definimos constantes con el nombre de las columnas de la tabla    */   public static final String C_COLUMNA_ID   = "_id";   public static final String C_COLUMNA_NOMBRE = "hip_nombre";   public static final String C_COLUMNA_CONDICIONES = "hip_condiciones";   public static final String C_COLUMNA_CONTACTO = "hip_contacto";   public static final String C_COLUMNA_EMAIL = "hip_email";   public static final String C_COLUMNA_TELEFONO = "hip_telefono";   public static final String C_COLUMNA_OBSERVACIONES = "hip_observaciones";    private Context contexto;   private HipotecaDbHelper dbHelper;   private SQLiteDatabase db;    /**    * Definimos lista de columnas de la tabla para utilizarla en las consultas a la base de datos    */   private String[] columnas = new String[]{ C_COLUMNA_ID, C_COLUMNA_NOMBRE, C_COLUMNA_CONDICIONES, C_COLUMNA_CONTACTO, C_COLUMNA_EMAIL, C_COLUMNA_TELEFONO, C_COLUMNA_OBSERVACIONES} ;

    public HipotecaDbAdapter(Context context)   {      this.contexto = context;   }

    public HipotecaDbAdapter abrir() throws SQLException   {      dbHelper = new HipotecaDbHelper(contexto);      db = dbHelper.getWritableDatabase();      return this;   }

    public void cerrar()   {      dbHelper.close();   }

    /**    * Devuelve cursor con todos las columnas de la tabla    */   public Cursor getCursor() throws SQLException   {      Cursor c = db.query( true, C_TABLA, columnas, null, null, null, null, null, null);

       return c;   }}

Page 20: Tutorial Android

61 

2: HipotecaCursorAdapter

Definimos la clase HipotecaCursorAdapter que utilizaremos desde la Activity Hipoteca para

alimentar el ListView con los datos obtenidos a traves de la clase HipotecaDbAdapter.

123456789101112131415

package com.sodenet.hipotecas; import android.content.Context;import android.database.Cursor;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.CursorAdapter;import android.widget.TextView; public class HipotecaCursorAdapter extends CursorAdapter{

    private HipotecaDbAdapter dbAdapter = null ;    public HipotecaCursorAdapter(Context context, Cursor c)   {      super(context, c);      dbAdapter = new HipotecaDbAdapter(context);      dbAdapter.abrir();   }

    @Override   public void bindView(View view, Context context, Cursor cursor)   {

Page 21: Tutorial Android

16171819202122232425262728293031323334353637383

      TextView tv = (TextView) view ;

       tv.setText(cursor.getString(cursor.getColumnIndex(HipotecaDbAdapter.C_COLUMNA_NOMBRE)));   }

    @Override   public View newView(Context context, Cursor cursor, ViewGroup parent)   {      final LayoutInflater inflater = LayoutInflater.from(context);      final View view = inflater.inflate(android.R.layout.simple_dropdown_item_1line, parent, false);

       return view;   }}

Page 22: Tutorial Android

3: Diseño Layout Activity Principal

En la entrada anterior creamos la Activity Hipoteca dejando el diseño de la misma en

blanco. Ahora vamos a editar el layout de esta Activity posicionando un ListView que

utilizaremos para mostrar los registros de la base de datos SQLite.

Editamos archivo res/layout/activity_hipoteca.xml dejándolo como sigue a continuación:

123456789101112131415161718

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context=".Hipoteca" >     <ListView        android:id="@android:id/list"        android:layout_width="fill_parent"        android:layout_height="wrap_content"/>

     <TextView        android:id="@id/android:empty"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="@string/lista_vacia" />     </LinearLayout>

Page 23: Tutorial Android

19Añadimos al archivo res/values/strings.xml la definición de string que utilizamos cuando

la lista está vacía.

1 <string name="lista_vacia">Sin Datos</string>

 

4: Enlazar ListActivity con la base de datos SQLite

Modificamos la Activity principal de la aplicación para que herede de ListActivity, ya que

simplificará el tratamiento de la lista en próximas modificaciones.

En el método onCreate obtenemos la referencia a la ListView incluida en el layout y

creamos y preparamos el adaptador dbAdapter para gestionar las operaciones sobre la

entidad HIPOTECA en la base de datos SQLite.

El método consultar() se encargará de vincular el CursorAdapter hipotecaAdapter a la

ListView lista.

1234567891011121314151617181920212223242526

package com.sodenet.hipotecas; import android.app.ListActivity;import android.database.Cursor;import android.os.Bundle;import android.view.Menu;import android.widget.ListView; public class Hipoteca extends ListActivity {    private HipotecaDbAdapter dbAdapter;    private Cursor cursor;    private HipotecaCursorAdapter hipotecaAdapter ;    private ListView lista;    @Override   protected void onCreate(Bundle savedInstanceState) {      super.onCreate(savedInstanceState);      setContentView(R.layout.activity_hipoteca);

       lista = (ListView) findViewById(android.R.id.list);

       dbAdapter = new HipotecaDbAdapter(this);      dbAdapter.abrir();

       consultar();   }

    private void consultar()   {

Page 24: Tutorial Android

2728293031323334353637383940414243

      cursor = dbAdapter.getCursor();      startManagingCursor(cursor);      hipotecaAdapter = new HipotecaCursorAdapter(this, cursor);      lista.setAdapter(hipotecaAdapter);   }

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

 

5: Ejecución de la aplicación

¡Ya está todo listo! Ahora basta con ejecutar la aplicación en el emulador.

Page 25: Tutorial Android

Tutorial CRUD Android + SQLite (III): Mostrar datos en Formulario04/06/2013 18:29 ⋅ 2 Comentarios ⋅ pmon

En la entrada anterior vimos cómo mostrar en un listview registros de la base de datos

SQLitepara la aplicación CRUD de condiciones para la solicitud de una hipoteca. En la

entrada actual mostraremos los registros de forma individual en un formulario

profundizando en los siguientes conceptos:

Evento onListItemClick en ListView al seleccionar un registro

Navegar entre Actividades pasando datos con Intent putExtra

Consultar un registro de SQLite en Formulario

 

1: Diseño Layout Formulario

Creamos una nueva actividad HipotecaFormulario con diseño de formulario para mostrar los

datos de cada registro en la tabla HIPOTECA de SQLite.

Editamos archivo res/layout/activity_hipoteca_formulario.xml dejándolo como sigue a

continuación:

123456789

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".HipotecaFormulario" >    <RelativeLayout       android:layout_width="wrap_content"       android:layout_height="wrap_content"       android:orientation="vertical"

Page 26: Tutorial Android

1011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556

       android:padding="10dp" >        <TextView           android:id="@+id/label_nombre"           android:layout_width="wrap_content"           android:layout_height="wrap_content"           android:text="@string/label_nombre_hipoteca"           android:textAppearance="?android:attr/

textAppearanceMedium" />           <EditText           android:id="@+id/nombre"           android:layout_width="match_parent"           android:layout_height="wrap_content"           android:layout_alignParentLeft="true"           android:layout_below="@+id/label_nombre"           android:ems="10" />           <TextView           android:id="@+id/label_condiciones"           android:layout_width="wrap_content"           android:layout_height="wrap_content"           android:text="@string/label_condiciones"           android:textAppearance="?android:attr/textAppearanceMedium"           android:layout_below="@+id/nombre"           android:layout_marginTop="20dp" />               <EditText           android:id="@+id/condiciones"           android:layout_width="match_parent"           android:layout_height="wrap_content"           android:layout_alignParentLeft="true"           android:layout_below="@+id/label_condiciones"           android:ems="10"           android:inputType="textMultiLine">       </EditText>

               <TextView           android:id="@+id/label_contacto"           android:layout_width="wrap_content"           android:layout_height="wrap_content"           android:text="@string/label_contacto"           android:textAppearance="?android:attr/textAppearanceMedium"           android:layout_below="@+id/condiciones"           android:layout_marginTop="20dp" />               <EditText           android:id="@+id/contacto"           android:layout_width="match_parent"           android:layout_height="wrap_content"           android:layout_alignParentLeft="true"           android:layout_below="@+id/label_contacto"           android:ems="10">

Page 27: Tutorial Android

57585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101

       </EditText>

               <TextView           android:id="@+id/label_telefono"           android:layout_width="wrap_content"           android:layout_height="wrap_content"           android:text="@string/label_telefono"           android:textAppearance="?android:attr/textAppearanceMedium"           android:layout_below="@+id/contacto"           android:layout_marginTop="20dp" />               <EditText           android:id="@+id/telefono"           android:layout_width="wrap_content"           android:layout_height="wrap_content"           android:layout_alignParentLeft="true"           android:layout_below="@+id/label_telefono"           android:ems="10"           android:inputType="phone" >       </EditText>

               <TextView           android:id="@+id/label_email"           android:layout_width="wrap_content"           android:layout_height="wrap_content"           android:layout_below="@+id/telefono"           android:layout_marginTop="20dp"           android:text="@string/label_email"           android:textAppearance="?android:attr/

textAppearanceMedium" />              <EditText           android:id="@+id/email"           android:layout_width="wrap_content"           android:layout_height="wrap_content"           android:layout_alignParentLeft="true"           android:layout_below="@+id/label_email"           android:ems="10"           android:inputType="textEmailAddress"/>

       <TextView           android:id="@+id/label_observaciones"           android:layout_width="wrap_content"           android:layout_height="wrap_content"           android:text="@string/label_observaciones"           android:textAppearance="?android:attr/textAppearanceMedium"           android:layout_below="@+id/email"           android:layout_marginTop="20dp" />               <EditText           android:id="@+id/observaciones"           android:layout_width="match_parent"           android:layout_height="wrap_content"

Page 28: Tutorial Android

102103104105106107108109110111112113114115116117118119120121122

           android:layout_alignParentLeft="true"           android:layout_below="@+id/label_observaciones"           android:ems="10"           android:inputType="textMultiLine">       </EditText>

           </RelativeLayout></ScrollView>

Añadimos las etiquetas utilizadas en el formulario al archivo res/values/strings.xml

123

<string name="label_nombre_hipoteca">Nombre:</string><string name="label_condiciones">Condiciones:</string><string name="label_contacto">Contacto:</string><string name="label_telefono">Teléfono:</string>

Page 29: Tutorial Android

456

<string name="label_email">E-Mail:</string><string name="label_observaciones">Observaciones:</string>

Diseño de layout_hipoteca_formulario.xml

 

2: Navegar a Activity Formulario desde la Activity principal

A continuación enlazamos la selección de cada uno de los registros de la lista de hipotecas

con el formulario.

Para ello utilizaremos el evento onListItemClick de la ListActivity Hipoteca, que llama al

método visualizar.Este método declara el Intent necesario para iniciar la nueva actividad.

En este Intent incluimos los parámetros modo de comportamiento e identificador del

registro seleccionado.

Hipoteca.java

123456789101112

package com.sodenet.hipotecas; import android.app.ListActivity;import android.content.Intent;import android.database.Cursor;import android.os.Bundle;import android.view.Menu;import android.view.View;import android.widget.ListView; public class Hipoteca extends ListActivity {    public static final String C_MODO  = "modo" ;   public static final int C_VISUALIZAR = 551 ;

Page 30: Tutorial Android

1314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859

    private HipotecaDbAdapter dbAdapter;    private Cursor cursor;    private HipotecaCursorAdapter hipotecaAdapter ;    private ListView lista;    @Override   protected void onCreate(Bundle savedInstanceState) {      super.onCreate(savedInstanceState);      setContentView(R.layout.activity_hipoteca);

       lista = (ListView) findViewById(android.R.id.list);

       dbAdapter = new HipotecaDbAdapter(this);      dbAdapter.abrir();

       consultar();   }

    private void consultar()   {      cursor = dbAdapter.getCursor();      startManagingCursor(cursor);      hipotecaAdapter = new HipotecaCursorAdapter(this, cursor);      lista.setAdapter(hipotecaAdapter);   }

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

    private void visualizar(long id)   {      // Llamamos a la Actividad HipotecaFormulario indicando el modo visualización y el identificador del registro      Intent i = new Intent(Hipoteca.this, HipotecaFormulario.class);      i.putExtra(C_MODO, C_VISUALIZAR);      i.putExtra(HipotecaDbAdapter.C_COLUMNA_ID, id);

       startActivityForResult(i, C_VISUALIZAR);   }

    @Override   protected void onListItemClick(ListView l, View v, int position, long id)   {      super.onListItemClick(l, v, position, id);

       visualizar(id);   }}

Page 31: Tutorial Android

60616263646566 

3: Consultar un Registro de SQLite

Desde la actividad Formulario recibiremos el identificador del registro que debe mostrarse,

para obtener el registro de la base de datos SQLite incluiremos el nuevo

método getRegistro en la clase HipotecaCursorAdapter.java.

12345678910111213141516171819202122232425262728293031

package com.sodenet.hipotecas; import android.content.Context;import android.database.Cursor;import android.database.SQLException;import android.database.sqlite.SQLiteDatabase; public class HipotecaDbAdapter {    /**    * Definimos constante con el nombre de la tabla    */   public static final String C_TABLA = "HIPOTECA" ;    /**    * Definimos constantes con el nombre de las columnas de la tabla    */   public static final String C_COLUMNA_ID   = "_id";   public static final String C_COLUMNA_NOMBRE = "hip_nombre";   public static final String C_COLUMNA_CONDICIONES = "hip_condiciones";   public static final String C_COLUMNA_CONTACTO = "hip_contacto";   public static final String C_COLUMNA_EMAIL = "hip_email";   public static final String C_COLUMNA_TELEFONO = "hip_telefono";   public static final String C_COLUMNA_OBSERVACIONES = "hip_observaciones";    private Context contexto;   private HipotecaDbHelper dbHelper;   private SQLiteDatabase db;    /**    * Definimos lista de columnas de la tabla para utilizarla en las consultas a la base de datos    */   private String[] columnas = new String[]{ C_COLUMNA_ID, C_COLUMNA_NOMBRE, C_COLUMNA_CONDICIONES, C_COLUMNA_CONTACTO, C_COLUMNA_EMAIL, C_COLUMNA_TELEFONO, C_COLUMNA_OBSERVACIONES} ;

    public HipotecaDbAdapter(Context context)

Page 32: Tutorial Android

3233343536373839404142434445464748495051525354555657585960616263646566676869707172737475

   {      this.contexto = context;   }

    public HipotecaDbAdapter abrir() throws SQLException   {      dbHelper = new HipotecaDbHelper(contexto);      db = dbHelper.getWritableDatabase();      return this;   }

    public void cerrar()   {      dbHelper.close();   }

    /**    * Devuelve cursor con todos los registros y columnas de la tabla    */   public Cursor getCursor() throws SQLException   {      Cursor c = db.query( true, C_TABLA, columnas, null, null, null, null, null, null);

       return c;   }

    /**    * Devuelve cursor con todos las columnas del registro    */   public Cursor getRegistro(long id) throws SQLException   {      Cursor c = db.query( true, C_TABLA, columnas, C_COLUMNA_ID + "=" + id, null, null, null, null, null);       //Nos movemos al primer registro de la consulta      if (c != null) {         c.moveToFirst();      }      return c;   }}

 

Page 33: Tutorial Android

4: Mostrar registro en Activity Formulario

Una vez tenemos preparado el acceso desde la actividad principal al formulario y el

adaptador para obtener el registro de la base de datos SQLite, modificamos la clase del

formularioHipotecaFormulario.java como se detalla a continuación:

El método onCreate obtiene los datos que hemos pasado desde la Actividad principal

Preparamos el adaptador de base de datos que utilizaremos para consultar el registro

Obtenemos el registro de la base de datos y rellenamos los campos del formulario

Como hemos llamado al formulario en modo Visualización, desactivamos la edición de

los campos

12345678910111213141516171819202122232425262728293031323334

package com.sodenet.hipotecas; import android.app.Activity;import android.content.Intent;import android.database.Cursor;import android.os.Bundle;import android.widget.EditText; public class HipotecaFormulario extends Activity {    private HipotecaDbAdapter dbAdapter;    private Cursor cursor;    //    // Modo del formulario    //   private int modo ;    //   // Identificador del registro que se edita cuando la opción es MODIFICAR   //   private long id ;    //   // Elementos de la vista   //   private EditText nombre;   private EditText condiciones;   private EditText contacto;   private EditText telefono;   private EditText email;   private EditText observaciones;    @Override   protected void onCreate(Bundle savedInstanceState) {      super.onCreate(savedInstanceState);      setContentView(R.layout.activity_hipoteca_formulario);

       Intent intent = getIntent();      Bundle extra = intent.getExtras();

Page 34: Tutorial Android

3536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081

       if (extra == null) return;       //      // Obtenemos los elementos de la vista      //      nombre = (EditText) findViewById(R.id.nombre);      condiciones = (EditText) findViewById(R.id.condiciones);      contacto = (EditText) findViewById(R.id.contacto);      telefono = (EditText) findViewById(R.id.telefono);      email = (EditText) findViewById(R.id.email);      observaciones = (EditText) findViewById(R.id.observaciones);

       //      // Creamos el adaptador      //      dbAdapter = new HipotecaDbAdapter(this);      dbAdapter.abrir();

       //      // Obtenemos el identificador del registro si viene indicado      //      if (extra.containsKey(HipotecaDbAdapter.C_COLUMNA_ID))      {         id = extra.getLong(HipotecaDbAdapter.C_COLUMNA_ID);         consultar(id);      }

       //      // Establecemos el modo del formulario      //      establecerModo(extra.getInt(Hipoteca.C_MODO));

    }

    private void establecerModo(int m)   {      this.modo = m ;

       if (modo == Hipoteca.C_VISUALIZAR)      {         this.setTitle(nombre.getText().toString());         this.setEdicion(false);      }   }

    private void consultar(long id)   {      //      // Consultamos el centro por el identificador      //      cursor = dbAdapter.getRegistro(id);

       nombre.setText(cursor.getString(cursor.getColumnIndex(HipotecaDbAdapter.C_COLUMNA_NOMBRE)));      condiciones.setText(cursor.getString(cursor.getColumnIndex(HipotecaDbAdapter.C_COLUMNA_CONDI

Page 35: Tutorial Android

828384858687888990919293949596979899100101102103104105106107108109110111

CIONES)));      contacto.setText(cursor.getString(cursor.getColumnIndex(HipotecaDbAdapter.C_COLUMNA_CONTACTO)));      telefono.setText(cursor.getString(cursor.getColumnIndex(HipotecaDbAdapter.C_COLUMNA_TELEFONO)));      email.setText(cursor.getString(cursor.getColumnIndex(HipotecaDbAdapter.C_COLUMNA_EMAIL)));      observaciones.setText(cursor.getString(cursor.getColumnIndex(HipotecaDbAdapter.C_COLUMNA_OBSERVACIONES)));   }

    private void setEdicion(boolean opcion)   {      nombre.setEnabled(opcion);      condiciones.setEnabled(opcion);      contacto.setEnabled(opcion);      telefono.setEnabled(opcion);      email.setEnabled(opcion);      observaciones.setEnabled(opcion);   }}

 

5: Ejecución de la aplicación

Page 36: Tutorial Android

Por el momento no tenemos posibilidad de editar los registros de nuestra tabla Hipotecas y

todos los registros creados por defecto tienen únicamente el identificador y el nombre. Por

tanto, para mostrar una información más completa en el formulario vamos a ampliar el

contenido de registro con identificador 1.

Esto lo haremos desde el archivo HipotecaDbHelper.java. Modificamos la versión de la

base de datos de 1 a 2 y en el método onUpgrade hacemos un UPDATE rellenando la

información. Entraremos en detalle sobre esta cuestión en entradas posteriores.

123456789101112

@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){   if (newVersion == 2)   {      db.execSQL("UPDATE HIPOTECA SET hip_contacto = 'Julián Gómez Martínez'," +                  "              hip_email = '[email protected]'," +                  "              hip_observaciones = 'Tiene toda la documentación y está estudiando la solicitud. En breve llamará para

informar de las condiciones'" +                  " WHERE _id = 1");   }

 }

¡Ya está todo listo! Ahora basta con ejecutar la aplicación en el emulador.

Page 37: Tutorial Android

Tutorial CRUD Android + SQLite (IV): Insertar datos desde Formulario04/16/2013 21:24 ⋅ 2 Comentarios ⋅ pmon

En la entrada anterior vimos cómo mostrar registros de la base de datos SQLite en un

formulario, en esta nos centraremos en cómo insertar registros en una base de datos

SQLite desde un formulario.

Para ello veremos los siguientes conceptos:

Definir el menú de la actividad para navegar al formulario en modo Inserción

Insertar registros en la base de datos SQLite

Devolver un resultado desde el Formulario a la actividad principal

Refrescar el ListView para mostrar el nuevo registro insertado

 

1: Personalizar Menú Actividad

Editamos el menú de la actividad res/menu/hipoteca.xml para incluir la opción para crear

nuevo registro.

1234567

<menu xmlns:android="http://schemas.android.com/apk/res/android" >     <item        android:id="@+id/menu_crear"      android:title="@string/menu_crear" /> </menu>

Incluimos la nueva cadena en el fichero res/values/strings.xml.

1 <string name="menu_crear">Nuevo</string>

Añadimos una nueva propiedad estática a la clase Hipoteca.java que utilizaremos después

para indicar la acción a realizar por el formulario.

123456789

public class Hipoteca extends ListActivity {       public static final String C_MODO  = "modo" ;   public static final int C_VISUALIZAR = 551 ;   public static final int C_CREAR = 552 ;       ...   ...   ...

Page 38: Tutorial Android

Definimos el método onMenuItemSelected de Hipoteca.java para realizar la llamada a

la actividad formulario. La llamada se realiza con el

método startActivityForResult porque de esa forma nos permitirá conocer el resultado de

la operación realizada desde la actividad llamada.

123456789101112131415

@Overridepublic boolean onMenuItemSelected(int featureId, MenuItem item){   Intent i;

       switch (item.getItemId())   {      case R.id.menu_crear:         i = new Intent(Hipoteca.this, HipotecaFormulario.class);         i.putExtra(C_MODO, C_CREAR);         startActivityForResult(i, C_CREAR);         return true;   }   return super.onMenuItemSelected(featureId, item);}

 

2: Insertar registro en SQLite desde Formulario

Comenzamos añadiendo a la clase HipotecaDbAdapter.java el método que utilizaremos

para insertar los datos que enviaremos desde el formulario.

12345678910

/** * Inserta los valores en un registro de la tabla */public long insert(ContentValues reg){   if (db == null)      abrir();

       return db.insert(C_TABLA, null, reg);}

Modificamos el diseño del formulario res/layout/activity_hipoteca_formulario.xml para

incluir al final una botonera para Guardar y Cancelar.

1234

<LinearLayout     android:id="@+id/botonera"     android:layout_width="match_parent"     android:layout_height="wrap_content"     android:layout_below="@id/observaciones"

Page 39: Tutorial Android

5678910111213141516171819202122

     android:gravity="center"     android:layout_marginTop="20dp"     android:orientation="horizontal" >      <Button         android:id="@+id/boton_cancelar"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:text="@string/boton_cancelar" />      <Button         android:id="@+id/boton_guardar"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:text="@string/boton_guardar" />  </LinearLayout>

Añadimos a la clase Hipoteca.java para añadir las siguientes funcionalidades:

Definimos los eventos onClick de los botones

Mostramos u Ocultamos la botonera según la acción que estamos realizando

Definimos el método guardar que recoge los valores del formulario y llama al

Adaptador de la tabla de base de datos

Finalizamos la ejecución del formulario devolviendo el control a la actividad principal

123456789101112131415161718192021

package com.sodenet.hipotecas; import android.app.Activity;import android.content.ContentValues;import android.content.Intent;import android.database.Cursor;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.Toast; public class HipotecaFormulario extends Activity {       private HipotecaDbAdapter dbAdapter;    private Cursor cursor;        //    // Modo del formulario    //   private int modo ;       //   // Identificador del registro que se edita cuando la opción es MODIFICAR   //

Page 40: Tutorial Android

2223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

   private long id ;       //   // Elementos de la vista   //   private EditText nombre;   private EditText condiciones;   private EditText contacto;   private EditText telefono;   private EditText email;   private EditText observaciones;       private Button boton_guardar;   private Button boton_cancelar;    @Override   protected void onCreate(Bundle savedInstanceState) {      super.onCreate(savedInstanceState);      setContentView(R.layout.activity_hipoteca_formulario);

             Intent intent = getIntent();      Bundle extra = intent.getExtras();

       if (extra == null) return;             //      // Obtenemos los elementos de la vista      //      nombre = (EditText) findViewById(R.id.nombre);      condiciones = (EditText) findViewById(R.id.condiciones);      contacto = (EditText) findViewById(R.id.contacto);      telefono = (EditText) findViewById(R.id.telefono);      email = (EditText) findViewById(R.id.email);      observaciones = (EditText) findViewById(R.id.observaciones);

       boton_guardar = (Button) findViewById(R.id.boton_guardar);      boton_cancelar = (Button) findViewById(R.id.boton_cancelar);

             //      // Creamos el adaptador        //      dbAdapter = new HipotecaDbAdapter(this);      dbAdapter.abrir();

             //      // Obtenemos el identificador del registro si viene indicado      //      if (extra.containsKey(HipotecaDbAdapter.C_COLUMNA_ID))      {         id = extra.getLong(HipotecaDbAdapter.C_COLUMNA_ID);         consultar(id);      }

             //

Page 41: Tutorial Android

69707172737475767778798081828384858687888990919293949596979899100101102103104105106107

      // Establecemos el modo del formulario      //      establecerModo(extra.getInt(Hipoteca.C_MODO));

             //      // Definimos las acciones para los dos botones      //      boton_guardar.setOnClickListener(new View.OnClickListener() {                   @Override         public void onClick(View v)         {            guardar();         }      });

             boton_cancelar.setOnClickListener(new View.OnClickListener() {                   @Override         public void onClick(View v)         {            cancelar();          }      });

          }

       private void establecerModo(int m)   {      this.modo = m ;

             if (modo == Hipoteca.C_VISUALIZAR)      {         this.setTitle(nombre.getText().toString());         this.setEdicion(false);      }      else if (modo == Hipoteca.C_CREAR)      {         this.setTitle(R.string.hipoteca_crear_titulo);         this.setEdicion(true);      }

          }

       private void consultar(long id)   {      //      // Consultamos el centro por el identificador      //      cursor = dbAdapter.getRegistro(id);

             nombre.setText(cursor.getString(cursor.getColumnIndex(HipotecaDbAdapter.C_COLUMNA_NOMBRE)));      condiciones.setText(cursor.getString(cursor.getColumnIndex(HipotecaDbAdapter.C_COLUMNA_CONDICIONES)));

Page 42: Tutorial Android

10810911011111211311411511611711811912012112212312412512612712812913013

      contacto.setText(cursor.getString(cursor.getColumnIndex(HipotecaDbAdapter.C_COLUMNA_CONTACTO)));      telefono.setText(cursor.getString(cursor.getColumnIndex(HipotecaDbAdapter.C_COLUMNA_TELEFONO)));      email.setText(cursor.getString(cursor.getColumnIndex(HipotecaDbAdapter.C_COLUMNA_EMAIL)));      observaciones.setText(cursor.getString(cursor.getColumnIndex(HipotecaDbAdapter.C_COLUMNA_OBSERVACIONES)));   }

       private void setEdicion(boolean opcion)   {      nombre.setEnabled(opcion);      condiciones.setEnabled(opcion);      contacto.setEnabled(opcion);      telefono.setEnabled(opcion);      email.setEnabled(opcion);      observaciones.setEnabled(opcion);   }

       private void guardar()   {      //      // Obtenemos los datos del formulario      //       ContentValues reg = new ContentValues();             reg.put(HipotecaDbAdapter.C_COLUMNA_NOMBRE, nombre.getText().toString());      reg.put(HipotecaDbAdapter.C_COLUMNA_CONDICIONES, condiciones.getText().toString());      reg.put(HipotecaDbAdapter.C_COLUMNA_CONTACTO, contacto.getText().toString());      reg.put(HipotecaDbAdapter.C_COLUMNA_TELEFONO, telefono.getText().toString());      reg.put(HipotecaDbAdapter.C_COLUMNA_EMAIL, email.getText().toString());      reg.put(HipotecaDbAdapter.C_COLUMNA_OBSERVACIONES, observaciones.getText().toString());

             if (modo == Hipoteca.C_CREAR)      {         dbAdapter.insert(reg);         Toast.makeText(HipotecaFormulario.this, R.string.hipoteca_crear_confirmacion, Toast.LENGTH_SHORT).show();      }    

             //      // Devolvemos el control      //      setResult(RESULT_OK);      finish();   }

       private void cancelar()   {      setResult(RESULT_CANCELED, null);      finish();   }}

Page 43: Tutorial Android

1132133134135136137138139140141142143144145146147148149150151152153154

Page 44: Tutorial Android

15515615715815916016116216316416516616716816917017117217317417517617717

Page 45: Tutorial Android

8179180181Desde el método guardar se lanza un mensaje informativo que debemos registrar

enres/values/strings.xml. También definimos el texto que se mostrará en el formulario en

modo creación.

12

<string name="hipoteca_crear_titulo">Nueva Hipoteca</string><string name="hipoteca_crear_confirmacion">Hipoteca creada</string>

 

3: Capturar el ActivityResult en la actividad principal

Tanto si se guarda el registro desde el formulario o se cancela la inserción se devolverá el

control a la actividad principal con setResult. Para ello, definimos en Hipoteca.java el

métodoonActivityResult.

12345678910111213141516

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data){   //   // Nos aseguramos que es la petición que hemos realizado   //   switch(requestCode)   {      case C_CREAR:         if (resultCode == RESULT_OK)            consultar();

                default:         super.onActivityResult(requestCode, resultCode, data);   }}

 

4: Ejecución de la aplicación

¡Ya está todo listo! Ahora basta con ejecutar la aplicación en el emulador.

Page 46: Tutorial Android
Page 47: Tutorial Android

Tutorial CRUD Android + SQLite (V): Eliminar registros desde formulario04/28/2013 12:35 ⋅ 3 Comentarios ⋅ pmon

En la entrada anterior vimos cómo insertar registros de la base de datos SQLite desde un

formulario, en esta nos centraremos en cómo eliminar registros en una base de datos

SQLite desde un formulario.

Para ello veremos los siguientes conceptos:

Cargar el menú indicado para la acción del formulario

Eliminar registros en la base de datos SQLite

Devolver un resultado desde el formulario a la actividad principal

Refrescar el ListView para ocultar el registro eliminado

 

1: Definir varios menús para una actividad

Puesto que la actividad formulario puede lanzarse para visualizar o borrar registros las

opciones del menú deben ser diferentes. Por ello definiremos dos menús y cargaremos

enonPrepareOptionsMenu el que corresponda.

El menú el formulario en modo visualización lo definiremos

enres/menu/hipoteca_formulario_ver.xml y tendrá la opción eliminar mientras que el

menú para el modo inserción lo

llamaremos res/menu/hipoteca_formulario_editar.xml y tendrá las opciones guardar y

cancelar. Lo llamamos editar porque reutilizaremos el menú para añadir nuevas opciones

en próximos entradas.

res/menu/hipoteca_formulario_ver.xml

1234567

<menu xmlns:android="http://schemas.android.com/apk/res/android" >     <item        android:id="@+id/menu_eliminar"      android:title="@string/menu_eliminar" /> </menu>

src/Hipoteca.java

res/menu/hipoteca_formulario_editar.xml

12345

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

       <item          android:id="@+id/menu_guardar"          android:title="@string/menu_guardar" />

Page 48: Tutorial Android

67891011

             <item          android:id="@+id/menu_cancelar"          android:title="@string/menu_cancelar" />       </menu>

Incluimos las nuevas cadenas en el fichero res/values/strings.xml.

src/Hipoteca.java

123

<string name="menu_guardar">Guardar</string><string name="menu_cancelar">Cancelar</string><string name="menu_eliminar">Eliminar</string>

 

2: Cargar menú en el método onPrepareOptionsMenu

Como indicabamos antes, dependiendo de la acción del formulario cargaremos el menú

correspondiente en el método onPrepareOptionsMenu. Para ello

modificamossrc/HipotecaFormulario.java añadiendo lo que sigue a continuación.

123456789101112131415161

...

...   @Override   public boolean onCreateOptionsMenu(Menu menu) {       menu.clear();

              if (modo == Hipoteca.C_VISUALIZAR)         getMenuInflater().inflate(R.menu.hipoteca_formulario_ver, menu);

             else         getMenuInflater().inflate(R.menu.hipoteca_formulario_editar, menu);

             return true;   }......

Page 49: Tutorial Android

3: Definir acciones del menú en el método onMenuItemSelected

En el método onMenuItemSelected capturaremos la opción pulsada del menú y

realizaremos la acción que corresponda en cada caso, entre ellas la nueva acción borrar.

Para ello modificamossrc/HipotecaFormulario.java añadiendo lo que sigue a

continuación.

12345678910111213141516171819202122232425262728293031323334

...

...   @Override   public boolean onMenuItemSelected(int featureId, MenuItem item) {

             switch (item.getItemId())      {         case R.id.menu_eliminar:            borrar(id);            return true;                      case R.id.menu_cancelar:            cancelar();            return true;                      case R.id.menu_guardar:            guardar();            return true;      }

             return super.onMenuItemSelected(featureId, item);   }   @Override   public boolean onMenuItemSelected(int featureId, MenuItem item) {

             switch (item.getItemId())      {         case R.id.menu_eliminar:            borrar(id);            return true;                      case R.id.menu_cancelar:            cancelar();            return true;                      case R.id.menu_guardar:            guardar();            return true;

Page 50: Tutorial Android

35363738394041424344

      }

             return super.onMenuItemSelected(featureId, item);   }......

 

4: Eliminar registro con mensaje de confirmación

La eliminación del registro la haremos solicitando previamente una confirmación por parte

del usuario con un AlertDialog. Para ello

modificamos src/HipotecaFormulario.java añadiendo lo que sigue a continuación.

1234567891011121314151617181920212223242526

...

...   private void borrar(final long id)   {      /**       * Borramos el registro con confirmación       */      AlertDialog.Builder dialogEliminar = new AlertDialog.Builder(this);             dialogEliminar.setIcon(android.R.drawable.ic_dialog_alert);      dialogEliminar.setTitle(getResources().getString(R.string.hipoteca_eliminar_titulo));      dialogEliminar.setMessage(getResources().getString(R.string.hipoteca_eliminar_mensaje));      dialogEliminar.setCancelable(false);

             dialogEliminar.setPositiveButton(getResources().getString(android.R.string.ok), newDialogInterface.OnClickListener() {

          public void onClick(DialogInterface dialog, int boton) {            dbAdapter.delete(id);            Toast.makeText(HipotecaFormulario.this, R.string.hipoteca_eliminar_confirmacion, Toast.LENGTH_SHORT).show();            /**             * Devolvemos el control             */            setResult(RESULT_OK);            finish();         }      });

             dialogEliminar.setNegativeButton(android.R.string.no, null);

Page 51: Tutorial Android

2728293031323334

             dialogEliminar.show();

          }......

Incluimos las nuevas cadenas en el fichero res/values/strings.xml.

123

<string name="hipoteca_eliminar_titulo">Eliminar Hipoteca</string><string name="hipoteca_eliminar_mensaje">¿Seguro que desea eliminar la Hipoteca?</string><string name="hipoteca_eliminar_confirmacion">Hipoteca eliminada</string>

Ahora solamente nos falta incluir el método delete en la

clase src/HipotecaDbAdapter.java

1234567891011121314

...

...   /**    * Eliminar el registro con el identificador indicado    */   public long delete(long id)   {      if (db == null)         abrir();

             return db.delete(C_TABLA, "_id=" + id, null);   }......

 

5: Refrescar el ListView de la actividad principal

Como hemos visto anteriormente, al borrar el registro se devuelve el control a la actividad

principal con el método setResult. Modificaremos el método onActivityResult de la

actividadsrc/Hipoteca.java para refrescar la información de la lista cuando volvamos del

formulario en modo Visualización.

12345

...

...   @Override   protected void onActivityResult(int requestCode, int resultCode, Intent data)   {

Page 52: Tutorial Android

6789101112131415161718192021222324

      //      // Nos aseguramos que es la petición que hemos realizado      //      switch(requestCode)      {         case C_CREAR:            if (resultCode == RESULT_OK)               consultar();

                      case C_VISUALIZAR:            if (resultCode == RESULT_OK)               consultar();

                      default:            super.onActivityResult(requestCode, resultCode, data);      }   }......

 

6: Ejecución de la aplicación

¡Ya está todo listo! Ahora basta con ejecutar la aplicación en el emulador.