Condividi tramite


Selezione data Android

Panoramica

In alcuni casi un utente deve immettere dati in un'applicazione Android. Per facilitare questa operazione, il framework Android fornisce il DatePicker widget e .DatePickerDialog DatePicker consente agli utenti di selezionare l'anno, il mese e il giorno in un'interfaccia coerente tra dispositivi e applicazioni. DatePickerDialog è una classe helper che incapsula l'oggetto DatePicker in una finestra di dialogo.

Le applicazioni Android moderne devono visualizzare in DatePickerDialog un oggetto DialogFragment. Ciò consentirà a un'applicazione di visualizzare DatePicker come finestra di dialogo popup o incorporata in un'attività. Inoltre, DialogFragment gestirà il ciclo di vita e la visualizzazione della finestra di dialogo, riducendo la quantità di codice che deve essere implementata.

Questa guida illustra come usare , di cui è stato eseguito il DatePickerDialogwrapping in un oggetto DialogFragment. L'applicazione di esempio visualizzerà come DatePickerDialog finestra di dialogo modale quando l'utente fa clic su un pulsante su un'attività. Quando la data viene impostata dall'utente, verrà TextView aggiornata con la data selezionata.

Screenshot of Pick Date button followed by Date Picker dialog

Requisiti

L'applicazione di esempio per questa guida è destinata ad Android 4.1 (livello API 16) o versione successiva, ma è applicabile ad Android 3.0 (livello API 11 o versione successiva). È possibile supportare le versioni precedenti di Android con l'aggiunta della libreria di supporto Android v4 al progetto e alcune modifiche al codice.

Uso di DatePicker

Questo esempio estenderà DialogFragment. La sottoclasse ospiterà e visualizzerà un oggetto DatePickerDialog:

Closeup of Date Picker dialog

Quando l'utente seleziona una data e fa clic sul pulsante OK , DatePickerDialog chiama il metodo IOnDateSetListener.OnDateSet. Questa interfaccia viene implementata dall'host DialogFragment. Se l'utente fa clic sul pulsante Annulla , il frammento e la finestra di dialogo verranno ignorati.

Esistono diversi modi per DialogFragment restituire la data selezionata all'attività di hosting:

  1. Richiamare un metodo o impostare una proprietà : l'attività può fornire una proprietà o un metodo specificamente per l'impostazione di questo valore.

  2. Genera un evento : DialogFragment può definire un evento che verrà generato quando OnDateSet viene richiamato.

  3. Utilizzare un oggetto Action : DialogFragment può richiamare un Action<DateTime> oggetto per visualizzare la data nell'attività. L'attività fornirà quando Action<DateTime si crea un'istanza di DialogFragment. Questo esempio userà la terza tecnica e richiede che l'attività fornisca un Action<DateTime> oggetto a DialogFragment.

Estensione della finestra di dialogoFragment

Il primo passaggio nella visualizzazione di un DatePickerDialog è la sottoclasse DialogFragment e implementare l'interfaccia 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);
    }
}

Il NewInstance metodo viene richiamato per creare un'istanza di un nuovo DatePickerFragmentoggetto . Questo metodo accetta un oggetto Action<DateTime> che verrà richiamato quando l'utente fa clic sul pulsante OK in DatePickerDialog.

Quando il frammento deve essere visualizzato, Android chiamerà il metodo OnCreateDialog. Questo metodo creerà un nuovo DatePickerDialog oggetto e lo inizializzerà con la data corrente e l'oggetto callback , ovvero l'istanza corrente dell'oggetto DatePickerFragment.

Nota

Tenere presente che il valore del mese in cui IOnDateSetListener.OnDateSet viene richiamato è compreso nell'intervallo da 0 a 11 e non da 1 a 12. Il giorno del mese sarà compreso nell'intervallo da 1 a 31 (a seconda del mese selezionato).

Visualizzazione di DatePickerFragment

Ora che è DialogFragment stato implementato, questa sezione esaminerà come usare il frammento in un'attività. Nell'app di esempio che accompagna questa guida, l'attività crea un'istanza dell'oggetto DialogFragment usando il NewInstance metodo factory e quindi la visualizza richiama DialogFragment.Show. Come parte della creazione DialogFragmentdi un'istanza di , l'attività passa un Action<DateTime>oggetto , che visualizzerà la data in un TextView oggetto ospitato dall'attività:

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

Riepilogo

Questo esempio ha illustrato come visualizzare un DatePicker widget come finestra di dialogo modale popup come parte di un'attività Android. Ha fornito un'implementazione dialogFragment di esempio e ha illustrato l'interfaccia IOnDateSetListener . In questo esempio è stato anche illustrato come DialogFragment possa interagire con l'attività host per visualizzare la data selezionata.