Programación Android, uso del CountDownTimer (proyecto TacitasCounter)

Share if you like...Share on Facebook0Tweet about this on TwitterShare on Google+0Share on LinkedIn0

Sigamos con ejemplos simples, perfectos para aprender lo más básico, pero os aconsejo no subirlos al market de Android.
En esta ocasión vamos a jugar un poco con un cronómetro, para ello vamos a hacer nuestra TacitasCounter, que llevará la cuenta de tazas de café llevamos, y configuraremos el tiempo que queremos tomarnos de descanso para tomarlo. Una vez finalizado, nos mostrará un aviso temporal en pantalla.
Empezaremos definiendo un Layout en el que tendremos tres botones, dos para aumentar y disminuir el tiempo (en minutos) que tendremos de descanso, y otro para iniciar o detener la aplicación. También incluirémos TextViews para mostrar el tiempo de descanso, tanto los TextViews como los botones van a tener un tamaño de letra configurado en el XML:
TacitasCounter1

Para esto vamos a utilizar un RelativeLayout, que contendrá el siguiente código:

<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" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="21sp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="15dp"
        android:layout_marginTop="15dp"
        android:text="@string/tacitas" />

    <TextView
        android:id="@+id/numTazas"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="21sp"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_marginRight="15dp"
        android:layout_marginTop="15dp"
        android:text="@string/numTacitas" />

    <Button
        android:id="@+id/btMas"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginRight="15dp"
        android:text="@string/tacitaMas"
        android:textSize="18sp"
        android:onClick="onClick"/>

    <TextView
        android:id="@+id/tvTime"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="@string/tacitasUp"
        android:textSize="21sp" />

    <Button
        android:id="@+id/btMenos"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:layout_marginLeft="15dp"
        android:text="@string/tacitaMenos"
        android:textSize="18sp"
        android:onClick="onClick" />

    <Button
        android:id="@+id/btStart"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginLeft="15dp"
        android:layout_marginRight="15dp"
        android:layout_marginBottom="15dp"
        android:text="@string/start"
        android:textSize="18sp"
        android:onClick="onClick" />

</RelativeLayout>

Como se puede ver en el código, el tamaño de letra lo hemos configurado en uno de los atributos de los componentes que hemos utilizado:

        android:textSize="18sp"

Una vez definido nuestro Layout tendremos que escribir el código de lo que va a hacer nuestra aplicación, en primer lugar definiremos las variables que necesitamos utilizar en nuestra aplicación:

// Variables que almacenarán el tiempo inicial y el número de tazas
// acumuladas.
private int brewTime, numTazas;

// TextViews que mostrarán el tiempo restante y el número de tazas
// acumuladas.
private TextView tvTime, tvNumTazas;

// Botón para iniciar y parar el contador.
private Button btStart;

// Variable que indicará si la aplicación está o no en marcha.
private boolean working;

// Cronómetro de la aplicación.
private CountDownTimer timer;

Al escribir los tipos de nuestras variables nos puede dar error, porque no estamos importando las clases que a su vez contienen las clases que nosotros estamos utilizando. Para solucionar esto podemos hacerlo de de varias maneras. Si ponemos el ratón sobre la linea roja con la que eclipse nos subraya el código nos saldrá un menú contextual que nos indicará las posibles soluciones, le damos a <Import “Clase que utilizamos”>. Si vamos al menú superior, podemos pulsar en “Source/Organize Imports”, o por último le podemos dar a la combinación de teclas “crtl+shift+o”, que representa el atajo para organizar los Imports. Una vez hecho esto, en la parte superior del código deberían quedar los Imports de la siguiente manera:

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

Una vez hecho esto, continuaremos escribiendo lo que nuestra aplicación debe hacer al iniciar (en el método onCreate). Esto es, básicamente, instanciar todos los elementos que necesitamos utilizar a lo largo de la aplicación:

// Iniciamos e instanciamos todas las variables.
numTazas = 0;
brewTime = 3;
working = false;

// Establecemos las referencias a los elementos del layout que vamos a
// utilizar en la aplicación.
btStart = (Button) findViewById(R.id.btStart);
tvNumTazas = (TextView) findViewById(R.id.numTazas);
tvTime = (TextView) findViewById(R.id.tvTime);<em id="__mceDel">

A continuación pasamos a configurar lo que harán nuestros botones, para esto utilizamos un método común que se lanzará al pulsar en cada botón, definido en el xml en el atributo onClick:

public void onClick(View v) {
	// Selector que actuará en función al botón que llame al evento.
	switch (v.getId()) {
	// En el caso de que lo llame el botón más.
	case R.id.btMas:

		break;
	// En el caso de que lo llame el botón menos.
	case R.id.btMenos:

		break;
	// En el caso de que lo llame el botón start.
	case R.id.btStart:

		break;
	}
}

Con el switch identificaremos el botón que está llamando al método, de esta manera lanzaremos un código determinado para cada uno. en el caso del btMas, tendremos que aumentar el tiempo que descansaremos, y actualizar la etiqueta que lo representa en pantalla, lo escribiremos entre el case que le corresponde al botón y el break que rompe el bloque de código:

// En el caso de que lo llame el btMas.
case R.id.btMas:
	if (brewTime < 10 && !working) {
		// Aumentamos la variable que almacena el tiempo.
		brewTime++;
		// Actualizamos el valor que nos muestra el TextView.
		tvTime.setText(String.valueOf(brewTime));
	}
	break;

Lo mismo haremos para los para los demás botones, el btMenos reducirá el tiempo y btStart iniciará o pausará la aplicación según el estado en que se encuentre:

// En el caso de que lo llame el btMenos.
case R.id.btMenos:
	if (brewTime > 1 && !working) {
		brewTime--;
		tvTime.setText(String.valueOf(brewTime));
	}
	break;
// En el caso de que lo llame el botón start.
case R.id.btStart:
	// Comprobamos si la aplicación está o no en marcha.
	if (!working) {
		// En el caso de que no esté funcionando llamamos al método
		// que definiremos después y que iniciará el contador.
		aTrabajar();
	} else {
		// En el caso de que la aplicación sí que esté funcionando, la
		// pausamos, cancelamos el timer y actualizamos el texto del
		// btStart.
		working = false;
		timer.cancel();
		btStart.setText("Start");

	}
	break;

Como vemos en el código, en el caso de que la aplicación no esté funcionando llamamos a un método que la pondrá en marcha, de lo contrario (si la aplicación sí que está funcionando) la pararemos.
Lo último que nos falta es escribir el método que va a poner en marcha nuestra aplicación. Este método tiene que definir e iniciar el contador. En la parte inferior del código escribiremos:

private void aTrabajar() {
	// Si no esta funcionando, la iniciamos.
	working = true;

	// Cambiamos el texto del botón start.
	btStart.setText("Stop");

	// Iniciamos el timer, como parámetros pasaremos el número de
	// minutos que hemos establecido en la aplicación, multiplicado
	// por 60 y por 1000 para obtener el valor en milisegundos, el
	// segúndo parámetro es el que nos dirá cada cuánto se produce el
	// "tick".
	timer = new CountDownTimer(brewTime * 60 * 1000, 100) {
		// Al declarar un nuevo CountDownTimer nos obliga a
		// sobreescribir algunos de sus eventos.
		@Override
		public void onTick(long millisUntilFinished) {
			// Este método se lanza por cada lapso de tiempo
			// transcurrido,
			tvTime.setText(String
					.valueOf(millisUntilFinished / 1000) + "s");
		}

		@Override
		public void onFinish() {
			// Este método se lanza cuando finaliza el contador.
			// Indicamos que la aplicación ya no está funcionando.
			working = false;

			// Aumentamos el número de "tacitas" que nos hemos
			// tomado, esto es opcional, si uno se quiere tomar un
			// litro de café o ToroRojo es libre.
			numTazas++;

			// Actualizamos los textos de las etiquetas y del botón,
			// como el parámetro que recibe el método .setText es
			// del tipo String, y el número de tazas lo tenemos
			// almacenado en int, utilizamos la clase String para
			// extraer el valor del int y convertirlo en el tipo
			// String.
			tvNumTazas.setText(String.valueOf(numTazas));
			tvTime.setText("Brew Up!");
			btStart.setText("Start");

			// Mostramos el aviso de que ha finalizado el tiempo.
			Toast.makeText(TacitasMain.this,
					getResources().getString(R.string.tacitasUp),
					Toast.LENGTH_SHORT).show();
		}
	};

	// Una vez configurado el timer, lo iniciamos.
	timer.start();

}

Y con esto ya habremos finalizado nuestra aplicación. Por fin podremos descansar de nuestro trabajo, tranquilos porque nuestra aplicación nos mostrará en pantalla cuándo se ha acabado nuestro periodo de descanso… Gracias a TacitasCounter!!!

Descargas

Puedes ver el resultado del ejemplo en tu móvil descargando nuestra aplicación desde Google Play.

Puedes acceder a nuestro repositorio para bajar el proyecto aquí.

Share if you like...Share on Facebook0Tweet about this on TwitterShare on Google+0Share on LinkedIn0
The following two tabs change content below.
Reborn as IT Developer. Desarrollador Android y fundador de Proyecto Simio. "En realidad, yo no puedo enseñar nada a nadie, sólo puedo hacerles pensar." - Sócrates.

3 thoughts on “Programación Android, uso del CountDownTimer (proyecto TacitasCounter)

Deja un comentario