Invoking a DatePickerDialog in Xamarin.Android is a bit tricky because it is done through callbacks and at the end one has to dispose it as well. Hence I present asynchronous extension methods PickDateAsync and PickDateAndAssignAsync.
With my code you can use this syntax and don’t worry about DatePickerDialog disposal:
EditText et1 = FindViewById<EditText>(Resource.Id.editText1);
await et1.PickDateAndAssignAsync();
There is also an overload that accepts an instance of CancellationToken. Here are the methods:
public static class DatePickerExtension
{
public static Task<DateTime> PickDateAsync(this EditText dateEdit)
{
return dateEdit.PickDateAsync(CancellationToken.None);
}
public static Task<DateTime> PickDateAsync(this EditText dateEdit, CancellationToken ct)
{
TaskCompletionSource<DateTime> tsc = new TaskCompletionSource<DateTime>();
DatePickerDialog picker = null;
DateTime current;
if (!DateTime.TryParse(dateEdit.Text, out current))
current = DateTime.Now;
picker = new DatePickerDialog(dateEdit.Context, (sender, e) =>
{
if (tsc != null)
{
if (ct.IsCancellationRequested)
{
tsc.SetCanceled();
}
else
{
tsc.SetResult(e.Date);
}
tsc = null;
picker.Dispose();
}
}, current.Year,current.Month-1,current.Day);
picker.Show();
return tsc.Task;
}
public static Task PickDateAndAssignAsync(this EditText dateEdit)
{
return dateEdit.PickDateAndAssignAsync(CancellationToken.None);
}
public static async Task PickDateAndAssignAsync(this EditText dateEdit, CancellationToken ct)
{
DateTime date = await dateEdit.PickDateAsync(ct);
if (!ct.IsCancellationRequested)
{
dateEdit.Text = date.ToString("d");
}
}
}
Enjoy awesome asynchronous C#/.net support.