Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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.
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:
Quando si fa clic sul pulsante PICK TIME , l'app di esempio avvia come TimePickerDialog illustrato in questo screenshot:
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:
Richiamo di un metodo o impostazione di una proprietà : l'attività può fornire una proprietà o un metodo specificamente per impostare questo valore.
Generazione di un evento :
DialogFragmentpuò definire un evento che verrà generato quandoOnTimeSetviene richiamato.Utilizzando un oggetto
Action:DialogFragmentpuò richiamare unAction<DateTime>oggetto per visualizzare l'ora nell'attività. L'attività fornirà quandoAction<DateTimesi crea un'istanza diDialogFragment.
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:
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 diDialogFragment. Implementa anche l'interfacciaTimePickerDialog.IOnTimeSetListener, ovvero fornisce il metodo richiestoOnTimeSet:public class TimePickerFragment : DialogFragment, TimePickerDialog.IOnTimeSetListenerTAGviene inizializzato a scopo di registrazione (MyTimePickerFragment può essere modificato in qualsiasi stringa che si desidera usare). L'azionetimeSelectedHandlerviene inizializzata in un delegato vuoto per impedire eccezioni di riferimento Null:public static readonly string TAG = "MyTimePickerFragment"; Action<DateTime> timeSelectedHandler = delegate { };Il
NewInstancemetodo factory viene chiamato per creare un'istanza di un nuovoTimePickerFragmentoggetto . Questo metodo accetta unAction<DateTime>gestore richiamato quando l'utente fa clic sul pulsante OK inTimePickerDialog: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
DialogFragmentmetodo OnCreateDialog. Questo metodo crea un nuovoTimePickerDialogoggetto e lo inizializza con l'oggetto Activity, l'oggetto callback (ovvero l'istanza corrente diTimePickerFragment) 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
TimePickerfinestra di dialogo, viene richiamato ilOnTimeSetmetodo .OnTimeSetcrea unDateTimeoggetto 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
DateTimeoggetto viene passato all'oggettotimeSelectedHandlerregistrato con l'oggettoTimePickerFragmentin fase di creazione.OnTimeSetrichiama 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):
Quando si fa clic su OK nella TimePicker finestra di dialogo, il gestore aggiorna l'attività con l'ora TextView scelta e quindi esce:
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:
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.




