En un proyecto reciente he tenido que trabajar con las librerías de compatibilidad de Android, en este caso para crear diálogos que permitan elegir fecha y hora, como estos:

En Android recomiendan usar un DialogFragment, que permite mostrar éstos diálogos en distintos layouts. Si pretendes que tu aplicación soporte este tipo de diálogos para versiones inferiores a Android 3.0, debes usar el DialogFragment mencionado anteriormente, si por lo contrario tu aplicación usa un minSdkVersion igual o superior a 11, puedes usar este otro DialogFragment. En este artículo se va a tratar la versión para soportar versiones anteriores a la 3.0.

Índice

Requisitos previos

Antes de empezar, es necesario descargar Support Library y agregarlas a nuestro proyecto Android (En eclipse, botón derecho en el proyecto ›› propiedades ›› Java Build Path ›› lib).

Otra forma de agregar la librería es hacer click derecho en el proyecto » Android Tools » Add support library.

Dicho esto, comencemos con el TimePickerDialog



Crear un TimePickerDialog

El primer paso es crear una clase fragment que herede de DialogFragment y devuelva un TimePickerDialog desde el método onCreateDialog() del fragment:

import android.app.Dialog;
import android.app.TimePickerDialog;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.text.format.DateFormat;
import android.widget.TimePicker;

import java.util.Calendar;

public class TimePickerFragment extends DialogFragment implements
        TimePickerDialog.OnTimeSetListener
{

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState)
    {
        // Use the current time as the default values for the picker
        final Calendar c = Calendar.getInstance();
        int hour = c.get(Calendar.HOUR_OF_DAY);
        int minute = c.get(Calendar.MINUTE);

        // Create a new instance of TimePickerDialog and return it
        return new TimePickerDialog(getActivity(), this, hour, minute,
                DateFormat.is24HourFormat(getActivity()));
    }

    public void onTimeSet(TimePicker view, int hourOfDay, int minute)
    {
    }
}

Para cerciorarnos que se está usando la librería de compatibilidad, basta con ver el import android.support.v4.app.DialogFragment;

Por ahora dejaremos el método onTimeSet vacío; pasemos a crear la interfaz. A modo de ejemplo, crearemos un botón que muestre el dialogo cuando sea pulsado:

<button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:onclick="mostrarDialogoDeTiempo" 
    android:text="Diálogo de tiempo"/>

Luego, creamos el método mostrarDialogoDeTiempo que será llamado al pulsar el botón:

public void mostrarDialogoDeTiempo(View v) {
   DialogFragment newFragment = new TimePickerFragment();
   newFragment.show(getSupportFragmentManager(), "timePicker");
}

Llegados a este punto, es importante saber qué clase hemos de importar. Ya que el objetivo buscado es lograr compatibilidad entre las distintas versiones de android, para que la interfaz de la aplicación sea la misma en cualquier versión, la clase a importar es import android.support.v4.app.DialogFragment;. De lo contrario, sería import android.app.DialogFragment; Otro aspecto importante de cara a la compatibilidad, es la llamada a getSupportFragmentManager() y que nuestra actividad herede de FragmentActivity en lugar de Activity.

Para comprobar que funciona, lanzamos el emulador, en este caso, con la versión 2.3 de Android:

El proceso de creación de un DatePickerDialog es muy similar.

Crear un DatePickerDialog

Definimos la clase:

import android.app.DatePickerDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.widget.DatePicker;

import java.util.Calendar;

public class DatePickerFragment extends DialogFragment
        implements DatePickerDialog.OnDateSetListener {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current date as the default date in the picker
        final Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);

        // Create a new instance of DatePickerDialog and return it
        return new DatePickerDialog(getActivity(), this, year, month, day);
    }

    public void onDateSet(DatePicker view, int year, int month, int day) {
        // Do something with the date chosen by the user
    }
}

Al igual que antes, creamos un botón que muestre el diálogo:

<button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:onclick="mostrarDialogoDeFecha" 
    android:text="Diálogo de fecha"/>

He implementamos el método que responderá al pulsar el botón:

public void mostrarDialogoDeFecha(View v){
   DialogFragment newFragment = new DatePickerFragment();
   newFragment.show(getSupportFragmentManager(), "datePicker");
}

Así de simple, es similar a crear un timePickerDialog.

Referencias