Selector de fechas de Android

Información general

Hay ocasiones en las que un usuario debe introducir datos en una aplicación Android. Para ayudar con esto, el marco de Android proporciona el DatePickerwidget y el DatePickerDialog. El DatePicker permite a los usuarios seleccionar el año, el mes y el día en una interfaz coherente entre dispositivos y aplicaciones. El DatePickerDialog es una clase auxiliar que encapsula el DatePicker en un cuadro de diálogo.

Las aplicaciones modernas de Android deben mostrar el DatePickerDialog en un DialogFragment. Esto permitirá a una aplicación mostrar DatePicker como un cuadro de diálogo emergente o incrustado en una actividad. Además, el DialogFragment administrará el ciclo de vida y la visualización del cuadro de diálogo, lo que reduce la cantidad de código que se debe implementar.

En esta guía se muestra cómo usar el DatePickerDialog, encapsulado en un DialogFragment. La aplicación de ejemplo mostrará el DatePickerDialog como un cuadro de diálogo modal cuando el usuario haga clic en un botón en una actividad. Cuando el usuario establezca la fecha, un TextView se actualizará con la fecha seleccionada.

Screenshot of Pick Date button followed by Date Picker dialog

Requisitos

La aplicación de ejemplo de esta guía tiene como destino Android 4.1 (nivel de API 16) o superior, pero se aplica a Android 3.0 (nivel de API 11 o superior). Es posible admitir versiones anteriores de Android con la adición de la biblioteca de soporte técnico de Android v4 al proyecto y algunos cambios de código.

Uso de DatePicker

Este ejemplo extenderá DialogFragment. La subclase hospedará y mostrará un DatePickerDialog:

Closeup of Date Picker dialog

Cuando el usuario selecciona una fecha y hace clic en el botón Aceptar, llamará DatePickerDialog al método IOnDateSetListener.OnDateSet. Esta interfaz se implementa mediante el host DialogFragment. Si el usuario hace clic en el botón Cancelar, el fragmento y el cuadro de diálogo se descartarán.

Hay varias maneras en que el DialogFragment puede devolver la fecha seleccionada a la actividad de hospedaje:

  1. Invocar un método o establecer una propiedad: La actividad puede proporcionar una propiedad o método específicamente para establecer este valor.

  2. Generar un evento: El DialogFragment puede definir un evento que se generará cuando se invoque OnDateSet.

  3. Use un Action El : DialogFragment puede invocar un Action<DateTime> para mostrar la fecha en la actividad. La actividad proporcionará el Action<DateTime al crear una instancia del DialogFragment. Este ejemplo usará la tercera técnica y requerirá que la actividad proporcione un Action<DateTime> al DialogFragment.

Extensión de DialogFragment

El primer paso para mostrar un DatePickerDialog es subclase DialogFragment y hacer que implemente la interfaz IOnDateSetListener:

public class DatePickerFragment : DialogFragment, 
                                  DatePickerDialog.IOnDateSetListener
{
    // TAG can be any string of your choice.
    public static readonly string TAG = "X:" + typeof (DatePickerFragment).Name.ToUpper();
    
    // Initialize this value to prevent NullReferenceExceptions.
    Action<DateTime> _dateSelectedHandler = delegate { };
    
    public static DatePickerFragment NewInstance(Action<DateTime> onDateSelected)
    {
        DatePickerFragment frag = new DatePickerFragment();
        frag._dateSelectedHandler = onDateSelected;
        return frag;
    }
    
    public override Dialog OnCreateDialog(Bundle savedInstanceState)
    {
        DateTime currently = DateTime.Now;
        DatePickerDialog dialog = new DatePickerDialog(Activity, 
                                                       this, 
                                                       currently.Year, 
                                                       currently.Month - 1,
                                                       currently.Day);
        return dialog;
    }
    
    public void OnDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth)
    {
        // Note: monthOfYear is a value between 0 and 11, not 1 and 12!
        DateTime selectedDate = new DateTime(year, monthOfYear + 1, dayOfMonth);
        Log.Debug(TAG, selectedDate.ToLongDateString());
        _dateSelectedHandler(selectedDate);
    }
}

El NewInstance método se invoca para crear una instancia de un nuevo DatePickerFragment. Este método toma un Action<DateTime> que se invocará cuando el usuario haga clic en el botón Aceptar en el DatePickerDialog.

Cuando se muestre el fragmento, Android llamará al método OnCreateDialog. Este método creará un nuevo objeto DatePickerDialog y lo inicializará con la fecha actual y el objeto de devolución de llamada (que es la instancia actual del DatePickerFragment).

Nota:

Tenga en cuenta que el valor del mes cuando se invoca IOnDateSetListener.OnDateSet está en el intervalo de 0 a 11 y no de 1 a 12. El día del mes estará en el intervalo de 1 a 31 (dependiendo del mes seleccionado).

Mostrar DatePickerFragment

Ahora que DialogFragment se ha implementado, en esta sección se examinará cómo usar el fragmento en una actividad. En la aplicación de ejemplo que acompaña a esta guía, la actividad creará una instancia del DialogFragment uso del NewInstance Factory Method y, a continuación, mostrará la invocación DialogFragment.Show. Como parte de la creación de instancias del DialogFragment, la actividad pasa un Action<DateTime>, que mostrará la fecha en un TextView hospedado por la actividad:

[Activity(Label = "@string/app_name", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
    TextView _dateDisplay;
    Button _dateSelectButton;

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        SetContentView(Resource.Layout.Main);

        _dateDisplay = FindViewById<TextView>(Resource.Id.date_display);
        _dateSelectButton = FindViewById<Button>(Resource.Id.date_select_button);
        _dateSelectButton.Click += DateSelect_OnClick;
    }

    void DateSelect_OnClick(object sender, EventArgs eventArgs)
    {
        DatePickerFragment frag = DatePickerFragment.NewInstance(delegate(DateTime time)
                                                                 {
                                                                     _dateDisplay.Text = time.ToLongDateString();
                                                                 });
        frag.Show(FragmentManager, DatePickerFragment.TAG);
    }
}

Resumen

En este ejemplo se explica cómo mostrar un widget de DatePicker como un cuadro de diálogo modal emergente como parte de una actividad de Android. Proporcionó una implementación DialogFragment de ejemplo y explicó la interfaz IOnDateSetListener. En este ejemplo también se muestra cómo DialogFragment puede interactuar con la actividad host para mostrar la fecha seleccionada.