jueves, 31 de enero de 2013

Conversor de monedas XML Android

Introducción:

En este tutorial explicaremos como crear un conversor de monedas simple que obtenga el valor de la conversión desde un fichero xml creado por nosotros mismo.

La aplicación pedirá al usuario que introduzca una cantidad de euros y la aplicación la convertirá a varias monedas obteniendo el valor del cambio a partir de un documento xml guardado como recurso de la aplicación.

Espero que le guste y le resulte fácil de comprender. No dude en comentar.

¡ Saludos !



Enlaces de interés:

Código Fuente
Puede descargar si lo desea el código fuente de este proyecto.



Pasos a seguir:

1. Creamos el documento xml que tendrá almacena los cambios de las monedas y lo guardaremos en la carpeta xml, por lo que la ruta sería res/xml/monedas.xml.


<?xml version="1.0" encoding="UTF-8" ?> <monedas> <dolar>0.68</dolar> <libra>0.90</libra> <yen>0.76</yen> </monedas>

2. Una vez que ya tenemos creado el fichero xml creamos la actividad principal con la interfaz que permita introducir los euros y visualizar el cambio en otras monedas. Un ejemplo de interfaz sería el siguiente.

<RelativeLayout 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" > <LinearLayout android:id="@+id/linearLayout1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <EditText android:id="@+id/edtxtEuros" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="0.24" android:hint="@string/euros" android:inputType="numberDecimal" > <requestFocus /> </EditText> <Button android:id="@+id/btnAceptar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:maxLines="5" android:text="@string/aceptar" /> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_below="@+id/linearLayout1" android:layout_marginTop="92dp" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/TextView04" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/dolares" android:textAppearance="?android:attr/textAppearanceMedium" /> <TextView android:id="@+id/txtDolares" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="right" android:text="0" android:textAppearance="?android:attr/textAppearanceLarge" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/TextView02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/libras" android:textAppearance="?android:attr/textAppearanceMedium" /> <TextView android:id="@+id/txtLibras" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="right" android:text="0" android:textAppearance="?android:attr/textAppearanceLarge" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/llenes" android:textAppearance="?android:attr/textAppearanceMedium" /> <TextView android:id="@+id/txtYenes" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="right" android:text="0" android:textAppearance="?android:attr/textAppearanceLarge" /> </LinearLayout> </LinearLayout> </RelativeLayout>

3. Ya que sabemos el tipo de interfaz que vamos a usar, declaramos los campos que vamos a utilizar en la clase de la actividad principal.

public class ConversorMonedasActivity extends Activity { ///////////////////////////////////////////////////////////////////// // CAMPOS // ///////////////////////////////////////////////////////////////////// // Campos gráficos private EditText edtxtEuros; // Campo gráfico donde el usuario introducirá la cantidad en euros private Button btnAceptar; // Botón donde el usuario iniciará la conversión private TextView txtDolares; // Campo gráfico donde se le mostrará al usuario el cambio a dólares private TextView txtLibras; // Campo gráfico donde se le mostrará al usuario el cambio a libras private TextView txtYenes; // Campo gráfico donde se le mostrará al usuario el cambio a yenes // Otros campos private int idRecurso; ///////////////////////////////////////////////////////////////////// // FIN CAMPOS // /////////////////////////////////////////////////////////////////////

4. Inicializamos los campos en el método onCreate() y también los eventos ha utilizar.

/** * Cuando se crea la actividad ... */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_conversor_monedas); // INICIALIZACIÓN CAMPOS /////////////////////////////////////////// // Inicialización campos gráficos edtxtEuros = (EditText) findViewById(R.id.edtxtEuros); btnAceptar = (Button) findViewById(R.id.btnAceptar); txtDolares = (TextView) findViewById(R.id.txtDolares); txtLibras = (TextView) findViewById(R.id.txtLibras); txtYenes = (TextView) findViewById(R.id.txtYenes); // Inicialización otros campos idRecurso = R.xml.monedas; // FIN INICIALIZACIÓN CAMPOS //////////////////////////////////////// ///////////////////////////////////////////////////////////////////// // EVENTOS // ///////////////////////////////////////////////////////////////////// btnAceptar.setOnClickListener(new OnClickListener() { /** * Calcula y muestra el cambio */ public void onClick(View v) { mostrarDatos(); } }); ///////////////////////////////////////////////////////////////////// // FIN EVENTOS // ///////////////////////////////////////////////////////////////////// }


5. Creamos el método que nos va a permitir leer el cambio a dólar del documento xml.

/** * Obtiene el cambio de dólares de un documento xml * * @return La cantidad de dólares obtenido */ public float leerDolares(){ // CAMPOS ////////////////////////////////////////////////////// XmlResourceParser xml; int evento; float dolares = 0; // Almacena la cantidad de cambio de dólares // FIN CAMPOS /////////////////////////////////////////////////// // EJECUCIÓN //////////////////////////////////////////////////// try { xml = getResources().getXml(idRecurso); evento = xml.getEventType(); // Recorre todo el documento xml while (evento != XmlPullParser.END_DOCUMENT){ // Comprueba el evento producido switch (evento) { // Comprueba si está en el inicio de una etiqueta case XmlPullParser.START_TAG: // Comprueba el nombre de la etiqueta if (xml.getName().equals("dolar")){ // Si es correcto ... // Obtiene el cambio xml.next(); dolares = Float.parseFloat(xml.getText()); } break; } // Avanza una posición en el xml evento = xml.next(); } } catch (NumberFormatException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (XmlPullParserException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return dolares; // FIN EJECUCIÓN //////////////////////////////////////////////// }

6. Creamos el método que obtiene el cambio a libras del documento xml.

/** * Obtiene el cambio de libras de un documento xml * * @return La cantidad de libras obtenido */ public float leerLibras(){ // CAMPOS ////////////////////////////////////////////////////// XmlResourceParser xml; int evento; float libras = 0; // Almacena la cantidad de cambio de libras // FIN CAMPOS /////////////////////////////////////////////////// // EJECUCIÓN //////////////////////////////////////////////////// try { xml = getResources().getXml(idRecurso); evento = xml.getEventType(); // Recorre todo el documento xml while (evento != XmlPullParser.END_DOCUMENT){ // Comprueba el evento producido switch (evento) { // Comprueba si está en el inicio de una etiqueta case XmlPullParser.START_TAG: // Comprueba el nombre de la etiqueta if (xml.getName().equals("libra")){ // Si es correcto ... // Obtiene el cambio xml.next(); libras = Float.parseFloat(xml.getText()); } break; } // Avanza una posición en el xml evento = xml.next(); } } catch (NumberFormatException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (XmlPullParserException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return libras; // FIN EJECUCIÓN //////////////////////////////////////////////// }

7. Creamos el método que obtiene el cambio de yenes del documento xml.

/** * Obtiene el cambio de yenes de un documento xml * * @return La cantidad de yenes obtenido */ public float leerYenes(){ // CAMPOS ////////////////////////////////////////////////////// XmlResourceParser xml; int evento; float yenes = 0; // Almacena la cantidad de cambio de yenes // FIN CAMPOS /////////////////////////////////////////////////// // EJECUCIÓN //////////////////////////////////////////////////// try { xml = getResources().getXml(idRecurso); evento = xml.getEventType(); // Recorre todo el documento xml while (evento != XmlPullParser.END_DOCUMENT){ // Comprueba el evento producido switch (evento) { // Comprueba si está en el inicio de una etiqueta case XmlPullParser.START_TAG: // Comprueba el nombre de la etiqueta if (xml.getName().equals("yen")){ // Si es correcto ... // Obtiene el cambio xml.next(); yenes = Float.parseFloat(xml.getText()); } break; } // Avanza una posición en el xml evento = xml.next(); } } catch (NumberFormatException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (XmlPullParserException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return yenes; // FIN EJECUCIÓN //////////////////////////////////////////////// }

8. Finalmente creamos el método que va a mostrar al usuario todos los datos obtenidos de los anteriores métodos.

/** * Muestra el cambio de euros a diferentes monedas */ public void mostrarDatos(){ // CAMPOS /////////////////////////////////////////////////////////// float euros; // Almacena los euros introducido por el usuario float dolares; // Almacena el cambio a dólares float libras; // Almacena el cambio a libras float yenes; // Almacena el cambio a llenes // FIN CAMPOS /////////////////////////////////////////////////////// // EJECUCIÓN //////////////////////////////////////////////////////// try { // Obtiene los euros introducido por el usuario euros = Float.parseFloat(edtxtEuros.getText().toString()); } catch (NumberFormatException e) { // Si la conversión no es correcta ... // Informa al usuario de que no se ha introducido un valor correcto Toast.makeText(getApplicationContext(), "No se ha introducido un valor correcto", Toast.LENGTH_SHORT).show(); // Se toma como valor por defecto 0 euros = 0; // Muestra al usuario el número que se ha tomado por defecto edtxtEuros.setText("0"); } // Obtiene el cambio a dólares dolares = euros * leerDolares(); // Obtiene el cambio a libras libras = euros * leerLibras(); // Obtiene el cambio a llenes yenes = euros * leerYenes(); // Muestra los datos txtDolares.setText(String.valueOf(dolares)); txtLibras.setText(String.valueOf(libras)); txtYenes.setText(String.valueOf(yenes)); // FIN EJECUCIÓN //////////////////////////////////////////////////// }


FIN

3 comentarios:

  1. Hola, como insertas la imagen en la barra del nombre de la app?
    Saludos

    ResponderEliminar
  2. Hola, muy buenas!! Para cambiar el icono principal de la aplicación, el que sale en la barra del nombre de la app tienes que ir al manifiesto de la aplicación y en la línea "<application android:icon="@drawable/ic_launcher" le indicas el nuevo icono que quieres que tenga.

    Puedes o añadirle uno nuevo con un nuevo nombre y cambiar la línea antes puesta, o mi consejo, sobrescribir el que ya tiene con el mismo nombre por el que tú quieres que tenga.
    El icono se llama "ic_launcher.png"

    El icono está guardado en las distintas carpetas drawable de la aplicación, cada carpeta tiene un sufijo, en donde se indica la resolución de las imágenes contenidas, si no quieres entrar en tamaños de imágenes, simplemente crea una carpeta llamada "drawable" sin más, y ahí metes tu icono de la aplicación.

    Si tienes más dudas o necesitas más información ya sabes por donde encontrarme! Saludos!!

    ResponderEliminar
  3. quien a probado este ejemplo me esta dando un problema a la hora de implementarlo

    ResponderEliminar