Conversor de Unidades On-Line Android:134679852

De vuelta con los tutoriales para el blog, hoy veremos como hacer un conversor en tiempo real para Android. Es un tutorial muy extenso porque implica varios aspectos que iremos viendo. Por supuesto, todo el codigo fuente esta alojado en Google Code para que le puedan echar un vistazo y probarla en sus computadoras. Aqui veremos todo un poco más suelto pero explicado de manera detallada.

 

En este tutorial aprenderemos

 

Pulgar hacia arriba   Utilizar Yahoo Finance API para consultar la cotización de la moneda

Pulgar hacia arriba   Utilizar un Progress Dialog en un hilo separado para controlar componentes de la UI

Pulgar hacia arriba   Utilizar Spinners con sus respectivos adaptadores

 

Lo primero que tenemos que hacer es definir nuestro XML que contendrá dos spinner (comboBox)  donde seleccionaremos la moneda de origen y la moneda de destino. También tendrá un editText para escribir la cantidad de dinero que deseamos convertir y un textView para mostrar el resultado obtenido.

 

 

Terminando la parte grafica, seguimos con la parte más interesante que es el codding.

Vamos a usar solo una clase que manejara esta vista.

 

Las siguientes funciones/instrucciones se ubicaran en el método onCreate

1) levantarXML()  –> aqui “levantaremos” los componentes XML para transformarlos en objetos. Para esto utilizaremos el “findViewById

 

2) Definimos un array de datos para los monedas soportadas:

 

final String[] datos = new String[]{"USD","EUR","ARS"};

3) Creamos un adaptador que hará de enlace entre nuestro spinner y el arreglo de datos que hemos creado

 

ArrayAdapter<String> adaptador =  new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, datos);
adaptador.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

 

4) Seteamos el mismo adaptador para ambos spinner porque contendrá las mismas monedas. Además cuando uno haga click en el spinner se guardara la moneda elegida

 

 

spinner_currency_one.setAdapter(adaptador);
        spinner_currency_two.setAdapter(adaptador);
       
         spinner_currency_one.setOnItemSelectedListener(new OnItemSelectedListener()
        {
            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1,
                    int arg2, long arg3)
            {
                moneda=datos[arg2].toLowerCase();
                Log.d("TAG",moneda);
            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0)
            {            }
        });
        spinner_currency_two.setOnItemSelectedListener(new OnItemSelectedListener()
        {
            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1,
                    int arg2, long arg3)
            {
                moneda1=datos[arg2].toLowerCase();
                Log.d("TAG",moneda1);
            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0)
            {        }
        })

Ahora viene la parte interesante donde todo se acumula. Vamos a definir el click del botón convertir que es el que hace toda la magia…

 

Lo primero que hacemos es una simple validación si el texto de la cantidad es vacío y si ambas monedas son iguales. Luego creamos un ProgressDialog que nos servirá como mensaje mientras nuestra app hace la consulta sobre la cotización. Es importante ya que si la consulta demora más tiempo el usuario pensara que la app se colgó y la cerrara cuando en realidad esta trabajando en segundo plano. Luego del PD ejecutamos un hilo que hará la petición.

 

      btn_convertí.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                if (!moneda.equals(moneda1)&&(edit_amount.getText().toString().length()>0))
                {
                    pd = ProgressDialog.show(lay_main.this,"", "Loading….", true, false);
                    new Thread(new Runnable()
                    {
                        @Override
                        public void run()
                        {
                            funcion();   
                            handler.sendEmptyMessage(0);
                        }
                    }).start();
                }
                else
                {
                    txt_resultado.setText("0.00");
                }
            }       
        });

Este codigo utiliza cosas que todavía no hemos definido y ya es hora de hacerlo.

 

1) Definimos un handler como campo. Cuando el proceso se termine llamara al handler y este hará el calculo de la cotización y mostrara el resultado obtenido. Además, cierra el PD.

 

Handler handler = new Handler()
{
        @Override
        public void handleMessage(Message msg)
        {
                Double dolares=Double.parseDouble(edit_amount.getText().toString());
                Double resultado=dolares*cotizacion;
                txt_resultado.setText(df.format(resultado)+" "+moneda1.toUpperCase());
                pd.dismiss();           
        }
};

2) Escribimos el codigo de funcion()

 

public void funcion()
    {
        InputStream is = null;
        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        nameValuePairs.add(new BasicNameValuePair("id","2"));
        try
        {
              HttpClient httpclient = new DefaultHttpClient();
              String URL = null;
                  URL="
http://finance.yahoo.com/d/quotes.csve=.csv&f=sl1d1t1&s="+moneda+moneda1+"=X";
              HttpPost httppost = new HttpPost(URL);
              httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
              HttpResponse response = httpclient.execute(httppost);
              HttpEntity entity = response.getEntity();
              is = entity.getContent();
        }
        catch(Exception e)
        {
              Log.e("TAG", "Error in http connection "+e.toString());
        }
        try
        {
             
            BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
              StringBuilder sb = new StringBuilder();
              String line = null;
              while ((line = reader.readLine()) != null)
              {
                      sb.append(line + "\n");
              }
              is.close();
      
              result=sb.toString();
              Log.e("TAG", " "+result+" ");
              cotizacion=Double.parseDouble(result.substring(11, 16));
      }
      catch(Exception e)
      {
              Log.e("TAG", "Error converting result "+e.toString());
      }
    }

 

 

Esta funcion lo que hace es un consulta a Yahoo Finance con los parámetros obtenidos de los spinner. Luego se procesa la respuesta y se la convierte a un Double para luego utilizarlo.

 

[NOTA IMPORTANTE] Agregar el permiso de Internet al manifiesto.

 

Espero que les haya gustado este tutorial y cualquier duda o sugerencia no duden en dejar un comentario en el blog.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *