Compartilhar via


Seletor de data do Android

Visão geral

Há ocasiões em que um usuário deve inserir dados em um aplicativo Android. Para ajudar com isso, a estrutura do Android fornece o DatePicker widget e o DatePickerDialog . O DatePicker permite que os usuários selecionem o ano, o mês e o dia em uma interface consistente entre dispositivos e aplicativos. O DatePickerDialog é uma classe auxiliar que encapsula o DatePicker em uma caixa de diálogo.

Os aplicativos Android modernos devem exibir o DatePickerDialog em um DialogFragment. Isso permitirá que um aplicativo exiba o DatePicker como uma caixa de diálogo pop-up ou inserido em uma Atividade. Além disso, o DialogFragment gerenciará o ciclo de vida e a exibição da caixa de diálogo, reduzindo a quantidade de código que deve ser implementada.

Este guia demonstrará como usar o DatePickerDialog, encapsulado em um DialogFragment. O aplicativo de exemplo exibirá o DatePickerDialog como uma caixa de diálogo modal quando o usuário clicar em um botão em uma Atividade. Quando a data for definida pelo usuário, um TextView será atualizado com a data selecionada.

Captura de tela do botão Escolher Data seguido da caixa de diálogo Seletor de Data

Requisitos

O aplicativo de exemplo para este guia tem como destino o Android 4.1 (nível de API 16) ou superior, mas é aplicável ao Android 3.0 (nível de API 11 ou superior). É possível dar suporte a versões mais antigas do Android com a adição da Biblioteca de Suporte do Android v4 ao projeto e algumas alterações de código.

Usando o DatePicker

Este exemplo estenderá DialogFragment. A subclasse hospedará e exibirá um DatePickerDialog:

Closeup da caixa de diálogo Seletor de Data

Quando o usuário selecionar uma data e clicar no botão OK , o DatePickerDialog chamará o método IOnDateSetListener.OnDateSet. Essa interface é implementada pela hospedagem DialogFragment. Se o usuário clicar no botão Cancelar , o fragmento e a caixa de diálogo serão descartados.

Há várias maneiras de DialogFragment retornar a data selecionada para a atividade de hospedagem:

  1. Invocar um método ou definir uma propriedade – a atividade pode fornecer uma propriedade ou um método especificamente para definir esse valor.

  2. Gerar um evento – o DialogFragment pode definir um evento que será acionado quando OnDateSet for invocado.

  3. Usar um Action – O DialogFragment pode invocar um Action<DateTime> para exibir a data na Atividade. A Atividade fornecerá o Action<DateTime ao instanciar o DialogFragment. Este exemplo usará a terceira técnica e exigirá que a Atividade forneça um Action<DateTime> para o DialogFragment.

Estendendo DialogFragment

A primeira etapa na exibição de um DatePickerDialog é subclasse DialogFragment e fazer com que ele implemente a IOnDateSetListener interface :

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);
    }
}

O NewInstance método é invocado para instanciar um novo DatePickerFragment. Esse método usa um Action<DateTime> que será invocado quando o usuário clicar no botão OK no DatePickerDialog.

Quando o fragmento for exibido, o Android chamará o método OnCreateDialog. Esse método criará um novo DatePickerDialog objeto e o inicializará com a data atual e o objeto de retorno de chamada (que é a instância atual do DatePickerFragment).

Observação

Lembre-se de que o valor do mês em IOnDateSetListener.OnDateSet que é invocado está no intervalo de 0 a 11 e não de 1 a 12. O dia do mês estará no intervalo de 1 a 31 (dependendo de qual mês foi selecionado).

Mostrando o DatePickerFragment

Agora que o DialogFragment foi implementado, esta seção examinará como usar o fragmento em uma atividade. No aplicativo de exemplo que acompanha este guia, a Atividade criará uma instância do DialogFragment usando o NewInstance método de fábrica e o exibirá invocando DialogFragment.Show. Como parte da instanciação do DialogFragment, a Atividade passa um Action<DateTime>, que exibirá a data em um TextView hospedado pela Atividade:

[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);
    }
}

Resumo

Este exemplo discutiu como exibir um DatePicker widget como uma caixa de diálogo modal pop-up como parte de uma atividade do Android. Ele forneceu uma implementação de DialogFragment de exemplo e discutiu a IOnDateSetListener interface . Este exemplo também demonstrou como o DialogFragment pode interagir com a Atividade do host para exibir a data selecionada.