Condividi tramite


Selezione ora Android

Per consentire all'utente di selezionare un'ora, è possibile usare TimePicker. Le app Android in genere usano TimePicker con TimePickerDialog per la selezione di un valore di tempo, che consente di garantire un'interfaccia coerente tra dispositivi e applicazioni. TimePicker consente agli utenti di selezionare l'ora del giorno in modalità 24 ore o 12 ore/PM. TimePickerDialog è una classe helper che incapsula l'oggetto TimePicker in una finestra di dialogo.

Screenshot di esempio della finestra di dialogo Selezione ora in azione

Panoramica

Le applicazioni Android moderne visualizzano in TimePickerDialog un dialogFragment. In questo modo, un'applicazione può visualizzare TimePicker come finestra di dialogo popup o incorporarla in un'attività. Inoltre, DialogFragment gestisce 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 TimePickerDialogwrapping in un oggetto DialogFragment. L'applicazione di esempio visualizza come TimePickerDialog finestra di dialogo modale quando l'utente fa clic su un pulsante su un'attività. Quando l'ora viene impostata dall'utente, la finestra di dialogo viene chiusa e un gestore aggiorna un oggetto TextView nella schermata Attività con l'ora selezionata.

Requisiti

L'applicazione di esempio per questa guida è destinata ad Android 4.1 (livello API 16) o versione successiva, ma può essere usata con 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 TimePicker

In questo esempio viene estesa DialogFragmentl'implementazione della sottoclasse degli DialogFragment host (denominati TimePickerFragment di seguito) e viene visualizzato un oggetto TimePickerDialog. Quando l'app di esempio viene avviata per la prima volta, viene visualizzato un pulsante PICK TIME sopra un TextView oggetto che verrà usato per visualizzare l'ora selezionata:

Schermata iniziale dell'app di esempio

Quando si fa clic sul pulsante PICK TIME , l'app di esempio avvia come TimePickerDialog illustrato in questo screenshot:

Screenshot della finestra di dialogo selezione ora predefinita visualizzata dall'app

TimePickerDialogIn , selezionando un'ora e facendo clic sul pulsante OK, viene TimePickerDialog richiamato il metodo IOnTimeSetListener.OnTimeSet. Questa interfaccia viene implementata dall'hosting DialogFragment (TimePickerFragmentdescritta di seguito). Facendo clic sul pulsante Annulla , il frammento e la finestra di dialogo verranno ignorati.

DialogFragment restituisce l'ora selezionata per l'attività di hosting in uno dei tre modi seguenti:

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

  2. Generazione di un evento : DialogFragment può definire un evento che verrà generato quando OnTimeSet viene richiamato.

  3. Utilizzando un oggetto Action : DialogFragment può richiamare un Action<DateTime> oggetto per visualizzare l'ora nell'attività. L'attività fornirà quando Action<DateTime si crea un'istanza di DialogFragment.

Questo esempio userà la terza tecnica, che richiede che l'attività fornisca un Action<DateTime> gestore a DialogFragment.

Avviare un progetto di app

Avviare un nuovo progetto Android denominato TimePickerDemo (se non si ha familiarità con la creazione di progetti Xamarin.Android, vedere Hello, Android per informazioni su come creare un nuovo progetto).

Modificare Resources/layout/Main.axml e sostituirlo con il codice XML seguente:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_horizontal"
    android:padding="16dp">
    <Button
        android:id="@+id/select_button"
        android:paddingLeft="24dp"
        android:paddingRight="24dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="PICK TIME"
        android:textSize="20dp" />
    <TextView
        android:id="@+id/time_display"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:paddingTop="22dp"
        android:text="Picked time will be displayed here"
        android:textSize="24dp" />
</LinearLayout>

Si tratta di un linearLayout di base con un controllo TextView che visualizza l'ora e un pulsante che apre l'oggetto TimePickerDialog. Si noti che questo layout usa stringhe e dimensioni hardcoded per semplificare e semplificare la comprensione dell'app: un'app di produzione usa normalmente le risorse per questi valori (come si può vedere nell'esempio di codice DatePicker ).

Modificare MainActivity.cs e sostituirne il contenuto con il codice seguente:

using Android.App;
using Android.Widget;
using Android.OS;
using System;
using Android.Util;
using Android.Text.Format;

namespace TimePickerDemo
{
    [Activity(Label = "TimePickerDemo", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {
        TextView timeDisplay;
        Button timeSelectButton;

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView(Resource.Layout.Main);
            timeDisplay = FindViewById<TextView>(Resource.Id.time_display);
            timeSelectButton = FindViewById<Button>(Resource.Id.select_button);
        }
    }
}

Quando si compila ed esegue questo esempio, viene visualizzata una schermata iniziale simile alla schermata seguente:

Schermata iniziale dell'app

Facendo clic sul pulsante PICK TIME non viene eseguita alcuna operazione perché l'oggetto DialogFragment non è ancora stato implementato per visualizzare .TimePicker Il passaggio successivo consiste nel creare questo DialogFragmentoggetto .

Estensione della finestra di dialogoFragment

Per estendere DialogFragment per l'uso con TimePicker, è necessario creare una sottoclasse derivata da DialogFragment e implementa TimePickerDialog.IOnTimeSetListener. Aggiungere la classe seguente a MainActivity.cs:

public class TimePickerFragment : DialogFragment, TimePickerDialog.IOnTimeSetListener
{
    public static readonly string TAG = "MyTimePickerFragment";
    Action<DateTime> timeSelectedHandler = delegate { };

    public static TimePickerFragment NewInstance(Action<DateTime> onTimeSelected)
    {
        TimePickerFragment frag = new TimePickerFragment();
        frag.timeSelectedHandler = onTimeSelected;
        return frag;
    }

    public override Dialog OnCreateDialog (Bundle savedInstanceState)
    {
        DateTime currentTime = DateTime.Now;
        bool is24HourFormat = DateFormat.Is24HourFormat(Activity);
        TimePickerDialog dialog = new TimePickerDialog
            (Activity, this, currentTime.Hour, currentTime.Minute, is24HourFormat);
        return dialog;
    }

    public void OnTimeSet(TimePicker view, int hourOfDay, int minute)
    {
        DateTime currentTime = DateTime.Now;
        DateTime selectedTime = new DateTime(currentTime.Year, currentTime.Month, currentTime.Day, hourOfDay, minute, 0);
        Log.Debug(TAG, selectedTime.ToLongTimeString());
        timeSelectedHandler (selectedTime);
    }
}

Questa TimePickerFragment classe è suddivisa in parti più piccole e spiegata nella sezione successiva.

Implementazione di DialogFragment

TimePickerFragment implementa diversi metodi: un metodo factory, un metodo di creazione di istanze dialog e il metodo del OnTimeSet gestore richiesto da TimePickerDialog.IOnTimeSetListener.

  • TimePickerFragment è una sottoclasse di DialogFragment. Implementa anche l'interfaccia TimePickerDialog.IOnTimeSetListener , ovvero fornisce il metodo richiesto OnTimeSet :

    public class TimePickerFragment : DialogFragment, TimePickerDialog.IOnTimeSetListener
    
  • TAG viene inizializzato a scopo di registrazione (MyTimePickerFragment può essere modificato in qualsiasi stringa che si desidera usare). L'azione timeSelectedHandler viene inizializzata in un delegato vuoto per impedire eccezioni di riferimento Null:

    public static readonly string TAG = "MyTimePickerFragment";
    Action<DateTime> timeSelectedHandler = delegate { };
    
  • Il NewInstance metodo factory viene chiamato per creare un'istanza di un nuovo TimePickerFragmentoggetto . Questo metodo accetta un Action<DateTime> gestore richiamato quando l'utente fa clic sul pulsante OK in TimePickerDialog:

    public static TimePickerFragment NewInstance(Action<DateTime> onTimeSelected)
    {
        TimePickerFragment frag = new TimePickerFragment();
        frag.timeSelectedHandler = onTimeSelected;
        return frag;
    }
    
  • Quando il frammento deve essere visualizzato, Android chiama il DialogFragment metodo OnCreateDialog. Questo metodo crea un nuovo TimePickerDialog oggetto e lo inizializza con l'oggetto Activity, l'oggetto callback (ovvero l'istanza corrente di TimePickerFragment) e l'ora corrente:

    public override Dialog OnCreateDialog (Bundle savedInstanceState)
    {
        DateTime currentTime = DateTime.Now;
        bool is24HourFormat = DateFormat.Is24HourFormat(Activity);
        TimePickerDialog dialog = new TimePickerDialog
            (Activity, this, currentTime.Hour, currentTime.Minute, is24HourFormat);
        return dialog;
    }
    
  • Quando l'utente modifica l'impostazione dell'ora nella TimePicker finestra di dialogo, viene richiamato il OnTimeSet metodo . OnTimeSet crea un DateTime oggetto utilizzando la data corrente e unisce l'ora (ora e minuto) selezionata dall'utente:

    public void OnTimeSet(TimePicker view, int hourOfDay, int minute)
    {
        DateTime currentTime = DateTime.Now;
        DateTime selectedTime = new DateTime(currentTime.Year, currentTime.Month, currentTime.Day, hourOfDay, minute, 0);
    
  • Questo DateTime oggetto viene passato all'oggetto timeSelectedHandler registrato con l'oggetto TimePickerFragment in fase di creazione. OnTimeSet richiama questo gestore per aggiornare la visualizzazione dell'ora dell'attività all'ora selezionata (questo gestore viene implementato nella sezione successiva):

    timeSelectedHandler (selectedTime);
    

Visualizzazione di TimePickerFragment

Ora che è DialogFragment stato implementato, è possibile creare un'istanza di DialogFragment usando il NewInstance metodo factory e visualizzarla richiamando DialogFragment.Show:

Aggiungere il metodo seguente a MainActivity:

void TimeSelectOnClick (object sender, EventArgs eventArgs)
{
    TimePickerFragment frag = TimePickerFragment.NewInstance (
        delegate (DateTime time)
        {
            timeDisplay.Text = time.ToShortTimeString();
        });

    frag.Show(FragmentManager, TimePickerFragment.TAG);
}

Dopo TimeSelectOnClick aver creato un'istanza TimePickerFragmentdi , crea e passa un delegato per un metodo anonimo che aggiorna la visualizzazione dell'ora dell'attività con il valore tempo trascorso. Infine, avvia il frammento di TimePicker dialogo (tramite DialogFragment.Show) per visualizzare l'oggetto TimePicker all'utente.

Alla fine del OnCreate metodo aggiungere la riga seguente per collegare il gestore eventi al pulsante PICK TIME che avvia la finestra di dialogo:

timeSelectButton.Click += TimeSelectOnClick;

Quando si fa clic sul pulsante PICK TIME , TimeSelectOnClick verrà richiamato per visualizzare il frammento di TimePicker dialogo all'utente.

Prova

Compilare ed eseguire l'app. Quando si fa clic sul pulsante PICK TIME , l'oggetto TimePickerDialog viene visualizzato nel formato di ora predefinito per l'attività (in questo caso, modalità 12 ore AM/PM):

La finestra di dialogo ora viene visualizzata in modalità AM/PM

Quando si fa clic su OK nella TimePicker finestra di dialogo, il gestore aggiorna l'attività con l'ora TextView scelta e quindi esce:

L'ora di A/M viene visualizzata nella visualizzazione testo attività

Aggiungere quindi la riga di codice seguente a OnCreateDialog subito dopo is24HourFormat la dichiarazione e l'inizializzazione:

is24HourFormat = true;

Questa modifica forza il flag passato al TimePickerDialog costruttore true in modo che venga usata la modalità 24 ore anziché il formato ora dell'attività di hosting. Quando si compila ed esegue di nuovo l'app, fare clic sul pulsante PICK TIME , la TimePicker finestra di dialogo viene ora visualizzata in formato 24 ore:

Finestra di dialogo TimePicker in formato 24 ore

Poiché il gestore chiama DateTime.ToShortTimeString per stampare l'ora in , l'ora TextViewviene ancora stampata nel formato 12 ore/PM predefinito.

Riepilogo

Questo articolo ha illustrato come visualizzare un TimePicker widget come finestra di dialogo modale popup da un'attività Android. Ha fornito un'implementazione di esempio DialogFragment e ha illustrato l'interfaccia IOnTimeSetListener . Questo esempio ha anche illustrato come l'oggetto DialogFragment può interagire con l'attività host per visualizzare l'ora selezionata.