Dialogs: DataPickerDialog y TimePickerDialog
jueves, febrero 23, 2012 at 8:43AM
jtristan in DataPickerDialog, Dialogs, TimePickerDialog, Tutorial Android

Un DataPickerDialog consiste en una nueva actividad con un único control DataPicker. Esta actividad se muestra sobre la actividad principal, dejando a esta en un segundo plano. Una de las principales características del DataPickerDialog es que gestiona por sí mismo el ciclo de vida de la actividad, encargándose de decidir cuando debe mostrarle, ocultarle o desecharle.

 

La clase DataPickerDialog extiende de la clase Dialogs. Además de la implementación del DataPicker, también podemos utilizar un TimePickerDialog para trabajar con un reloj, un AlertDialog que nos da la posibilidad de disponer de hasta tres botones y una lista de elementos seleccionables, pudiendo incluir checkboxes o radio buttons, o un ProcessDialog, para mostrar una barra de progreso sobre nuestra actividad. También es posible crearnos nuestros propios diálogos personalizados extendiendo de la clase Dialogs.

Vamos a ver como funcionan los DataPickerDialog y los TimePickerDialog mediante un ejemplo. Crearemos una actividad que tenga dos TextView. Estos contendrán la fecha y la hora actual. Si les pulsamos se abrirá el diálogo correspondiente mostrándonos el valor que tienen los TextView. Una vez que cerremos el diálogo traspasaremos los valores seleccionados a los TextView.

 

public class DatePickerDialogActivity extends Activity implements View.OnClickListener{			private TextView tvFechaHora;	private TextView tvHora;	int año;	int mes;	int dia;	int hora;	int minuto;		static final int DATE_DIALOG_ID = 0;	 	static final int TIME_DIALOG_ID = 1;

 

Nos declaramos las variables para la fecha y la hora así como dos constantes. Para abrir un diálogo utilizamos el método void showDialog (int id), al que tenemos que pasarle un identificador de tipo int. Una vez llamado este método, se ejecuta el método onCreateDialog(int, Bundle) donde recibimos el identificador. También disponemos del método showDialog(int id, Bundle args) si queremos pasar argumentos para la creación del diálogo.

A partir del API11 se creó la clase DialogFragment quedando obsoleto este método. Como nos interesa llegar al mayor número de dispositivos vamos a seguir utilizando este método.

 

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        tvFechaHora = (TextView)this.findViewById(R.id.tvFecha);        
        tvFechaHora.setOnClickListener(this);    
        
        final Calendar calendar = Calendar.getInstance();
        año = calendar.get(Calendar.YEAR);
        mes =  calendar.get(Calendar.MONTH);
        dia = calendar.get(Calendar.DAY_OF_MONTH);
                       
        actualizarLaFechaEnTextView();
        
        tvHora = (TextView)this.findViewById(R.id.tvHora);
        tvHora.setOnClickListener(this);
        
        hora = calendar.get(Calendar.HOUR);
        minuto = calendar.get(Calendar.MINUTE);
        
        actualizarLaHoraEnTextView();                     
        
    }

 

En nuestra actividad vamos a recoger la fecha y la hora actual y la visualizaremos en los TextView con un formato adecuado.

 

private void actualizarLaFechaEnTextView() {
	tvFechaHora.setText(new StringBuilder()
		.append(dia).append("/")
		.append(mes + 1).append("/")
		.append(año));									
}
	
private void actualizarLaHoraEnTextView() {
	tvHora.setText(new StringBuilder()
		.append(hora).append(":")
		.append(minuto));									
}

 

Como hemos dicho, cuando pulsemos los TextView se deben visualizar los diálogos. Para ello, vamos a utilizar el evento onClick.

 

@Override
public void onClick(View view) {		   
        switch (view.getId()){
		case R.id.tvFecha:		
			this.showDialog(DATE_DIALOG_ID);
			break;
		case R.id.tvHora:
			this.showDialog(TIME_DIALOG_ID);
			break;
	}
}

 

Al hacer la llamada a showDialog estamos creando nuestra nueva actividad y esta lanza el método onCreateDialog. Es aquí donde vamos a indicar el tipo de diálogo que queremos que se cree en función del identificador que hemos pasado.

 

@Override
protected Dialog onCreateDialog(int id) {
	switch (id){
		case DATE_DIALOG_ID:				
			return new DatePickerDialog(this,dateSetListener,año,mes,dia);
		case TIME_DIALOG_ID:
			return new TimePickerDialog(this, timeSetListener,hora, minuto, true);
	}
	return null;
}

 

El constructor de la clase DataPickerDialog o Time DatePickerDialog(Context context, DatePickerDialog.OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth), nos solicita además del contexto, que implementemos la interfaz OnDateSetListener, la cual va a ser la encargada de recoger los valores que hayamos seleccionado en el diálogo y devolverles. También nos pide los tres valores que va a mostrar por defecto al cargar el diálogo, el año, el mes y el día.

 

private DatePickerDialog.OnDateSetListener dateSetListener = new  DatePickerDialog.OnDateSetListener() {
		
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,int dayOfMonth) {
año = year;
		mes = monthOfYear;
		dia = dayOfMonth;
			
		actualizarLaFechaEnTextView();
	}
};

private TimePickerDialog.OnTimeSetListener timeSetListener = new TimePickerDialog.OnTimeSetListener(){

	@Override
	public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
		hora = hourOfDay;
		minuto = minute;			
		actualizarLaHoraEnTextView();
	}
};
 

 

La interfaz onTimeSetListener nos proporciona los valores seleccionados. Simplemente los pasamos a nuestros TextView.

 

Article originally appeared on javaHispano (http://www.javahispano.org/).
See website for complete article licensing information.