martes, 29 de enero de 2013

Estadísticas Empleados Android.

Introducción:

En este tutorial vamos a explicar como leer datos desde un fichero xml y cómo tratarlos.

El ejercicio que voy a explicar trata de leer un documento xml donde va a estar guardado los datos de los empleados, una vez que lea los datos del fichero xml la aplicación nos mostrará  la edad media y el sueldo máximo y mínimo de todos los empleados que están almacenados en el fichero xml.

En ese tutorial aprenderás a:

  • Crear un fichero xml básico
  • Utilizar la clase XmlPullParser para leer archivos xml
Espero que le guste. Si tiene cualquier problema no dude en comentar.

¡ Saludos!



Enlaces de interés:

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

Ayuda XmlPullParse
Ayuda oficial para la utilización de la clase XmlPullParse de Android, muy útil si tenemos problemas a la hora de entender su funcionamiento.




Pasos a seguir:

1. Antes de nada vamos a crear el xml que contiene los empleados que guardaremos en una carpeta que vamos a crear dentro de res, la vamos a llamar xml, por lo que la ruta sería res/xml/empleados.xml.

<?xml version="1.0" encoding="UTF-8" ?> <empresa nombre="Informática SA"> <empleados> <empleado> <nombre>Francisco</nombre> <puesto>Gerente</puesto> <edad>25</edad> <sueldo>1500</sueldo> </empleado> <empleado> <nombre>Paco</nombre> <puesto>Secretario</puesto> <edad>35</edad> <sueldo>1100</sueldo> </empleado> <empleado> <nombre>Sandra</nombre> <puesto>Informática</puesto> <edad>24</edad> <sueldo>1200</sueldo> </empleado> <empleado> <nombre>Maria</nombre> <puesto>Informática</puesto> <edad>29</edad> <sueldo>1200</sueldo> </empleado> <empleado> <nombre>Esteban</nombre> <puesto>Informático</puesto> <edad>25</edad> <sueldo>1200</sueldo> </empleado> <empleado> <nombre>Pablo</nombre> <puesto>Relaciones Públicas</puesto> <edad>21</edad> <sueldo>900</sueldo> </empleado> </empleados> </empresa>


2. Seguidamente creamos la interfaz de la activid principal que será la que nos muestre los datos, simplemente con unos TextView nos sería suficiente, 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: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" > <TextView android:id="@+id/TextView01" android:layout_width="200dp" android:layout_height="wrap_content" android:text="@string/edadMedia" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/txtEdadMedia" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Large Text" 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="200dp" android:layout_height="wrap_content" android:text="@string/sueldoMinimo" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/txtSueldoMinimo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Large Text" 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="200dp" android:layout_height="wrap_content" android:text="@string/sueldoMaximo" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/txtSueldoMaximo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Large Text" android:textAppearance="?android:attr/textAppearanceLarge" /> </LinearLayout> </LinearLayout> </RelativeLayout>

3. Declaramos los campos que vamos a utilizar en la clase de la actividad principal.

public class InformacionActivity extends Activity { //////////////////////////////////////////////////////////////////////////////////////////////////// // CAMPOS // //////////////////////////////////////////////////////////////////////////////////////////////////// // Campos gráficos private TextView txtEdadMedia; // Campo gráfico que muestra la edad media private TextView txtSueldoMinimo; // Campo gráfico que muestra el sueldo mínimo private TextView txtSueldoMaximo; // Campo gráfico que muestra el sueldo máximo // Otros campos private ArrayList<Integer> edades; // Almacena las edades de los empleados private ArrayList<Float> sueldos; // Almacena los sueldos de los empleados //////////////////////////////////////////////////////////////////////////////////////////////////// // FIN CAMPOS // ////////////////////////////////////////////////////////////////////////////////////////////////////

4. Inicializamos la variables en el método onCreate() además de definir los método que tendremos que usar que más adelante programaremos.

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_informacion); // Inicialización de campos gráficos txtEdadMedia = (TextView) findViewById(R.id.txtEdadMedia); txtSueldoMinimo = (TextView) findViewById(R.id.txtSueldoMinimo); txtSueldoMaximo = (TextView) findViewById(R.id.txtSueldoMaximo); // Inicialización de otros campos edades = new ArrayList<Integer>(); sueldos = new ArrayList<Float>(); // Ejecución // Obtiene las edades de los empleados leerEdades(R.xml.empleados); // Obtiene los sueldos de los empleados leerSueldos(R.xml.empleados); // Muestra los datos obtenidos por pantalla escribirDatos(); }


5. Creamos el método que  nos va a permitir obtener la edades de los empleados.

/** * Lee la edad de los empleados almacenados en un xml * * @param identificador El identificador del archivo xml */ public void leerEdades(int identificador){ // Campos XmlResourceParser xml; // Almacena el recurso xml int evento; // Almacena el evento recogido try { // Obtiene el recurso xml xml = getResources().getXml(identificador); // Obtiene el evento evento = xml.getEventType(); // Lee hasta el final del documento while (evento != XmlPullParser.END_DOCUMENT){ switch (evento) { case XmlPullParser.START_TAG: // Comprueba si es edad if (xml.getName().equals("edad")){ // Si es edad ... // Obtiene la edad xml.next(); edades.add(Integer.parseInt(xml.getText())); } break; } evento = xml.next(); } } catch (NotFoundException 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(); } }

6. Creamos otro método el cual nos permitirá leer el sueldo de los empleados.

/** * Lee el sueldo de los empleados almacenados en un xml * * @param identificador El identificador del archivo xml */ public void leerSueldos(int identificador){ // Campos XmlResourceParser xml; // Almacena el recurso xml int evento; // Almacena el evento recogido try { // Obtiene el recurso xml xml = getResources().getXml(identificador); // Obtiene el evento evento = xml.getEventType(); // Lee hasta el final del documento while (evento != XmlPullParser.END_DOCUMENT){ switch (evento) { case XmlPullParser.START_TAG: // Comprueba si es sueldo if (xml.getName().equals("sueldo")){ // Si es sueldo ... // Obtiene la sueldo xml.next(); sueldos.add(Float.parseFloat(xml.getText())); } break; } evento = xml.next(); } } catch (NotFoundException 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(); } }

7. Una vez obtenidos lo datos del xml tendremos que calcular la edad media de los empleados, por lo que crearemos un  método el cual no lo calcule a partir de los datos obtenidos.

/** * Obtiene la edad media de un conjunto de edades * @param edades La lista de edades * @return La edad media obtenida */ public float calcularEdadMedia(ArrayList<Integer> edades){ // Campos int suma; // Almacena la suma de las edades suma = 0; // Inicializa la variable // Recorre las edades almacenadas for (Integer edad : edades) { suma += edad; } // Calcula y devuelve la edad media return suma / edades.size(); }

8. También tendremos que calcular el suelo mínimo de los empleados por lo que utilizaremos el siguiente método.

/** * Calcula el sueldo mínimo de un conjunto de suelods * @return El sueldo mínimo */ public float calcularSueldoMinimo(ArrayList<Float> sueldos){ // Campos float sueldoTmp ; // Almacena el sueldo mínimo sueldoTmp = calcularSueldoMaximo(sueldos); // Inicializa la variable for (Float sueldo : sueldos) { // Comprueba si el sueldo almacenado es mayot if (sueldoTmp > sueldo){ // Si es mayor ... // Guardamos el nuevo sueldo (que es menor) sueldoTmp = sueldo; } } return sueldoTmp; }

9. Lo mismo tendremos que hacer para calcular el sueldo máximo, utilizaremos otro método para ello.

/** * Calcula el sueldo máximo de un conjunto de suelods * @return El sueldo máximo */ public float calcularSueldoMaximo(ArrayList<Float> sueldos){ // Campos float sueldoTmp ; // Almacena el sueldo máximo sueldoTmp = 0; // Inicializa la variable for (Float sueldo : sueldos) { // Comprueba si el sueldo almacenado es menor if (sueldoTmp < sueldo){ // Si es menor ... // Guardamos el nuevo sueldo (que es mayor) sueldoTmp = sueldo; } } return sueldoTmp; }

10. Y con el siguiente método informamos al usuario de los datos que hemos obtenidos a partir de los métodos anteriores.

/** * Muestra los datos obtenidos al usuario */ public void escribirDatos(){ // Muestra la edad media txtEdadMedia.setText(String.valueOf(calcularEdadMedia(edades))); // Muestra el sueldo mínimo txtSueldoMinimo.setText(String.valueOf(calcularSueldoMinimo(sueldos))); // Muestra el sueldo máximo txtSueldoMaximo.setText(String.valueOf(calcularSueldoMaximo(sueldos))); }


Para aprender más:

Reglas de un documento XML


Un archivo xml debe de estar bien formado para ello tiene que aplicarle las siguientes reglas:

  • Un documento XML siempre comienza con un prólogo (ver más abajo para una explicación de lo que es un prólogo)
  • Cada etiqueta de apertura tiene una etiqueta de cierre.
  • Todas las etiquetas están completamente anidados.
Un documento XML siempre se inicia con un prólogo que describe el archivo XML. Este prólogo puede ser mínimo, por ejemplo <? xml version = "1.0"> o puede contener otra información, por ejemplo, la codificación, por ejemplo <? xml version = "1.0" encoding = "UTF-8" standalone = "yes">

Fuente: vogella.com


FIN

2 comentarios:

  1. Hola buenas...

    Llevo días siguiendo tus tutoriales y me parecen geniales...

    En este caso en concreto...que debería de cambiar para que el archivo .xml lo recogiera de una url, y no de la carpeta /res/xml?

    ResponderEliminar
  2. Muy buenas y gracias.

    Te he modificado un método, en concreto el de LeerEdades() para que veas un ejemplo de como se haría.

    En el siguiente enlace te puedes descargar el código modificado.
    Enlace -> http://www.mediafire.com/view/?e90b18wvn3b55kc

    Para que todo termine de funcionar tendrás que añadirle los permisos de acceso ha internet a la aplicación que ya también te he indicado en el mismo fichero.


    De todas formas también te lo explico aquí:

    Para añadirle los permisos a la actividad principal tendrías que poner en el método onCreate() la siguiente línea:

    // Permisos para poder acceder a internet
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);

    Y para terminar, también tendría que añadirle el permiso de internet al manifiesto, para ello tendría que añadir esta línea fuera de la etiqueta application:




    De nuevo muchas gracias y espero haber resulto tu duda.

    ¡ Saludos !

    ResponderEliminar