Výběr času androidu
Pokud chcete uživateli poskytnout způsob, jak vybrat čas, můžete použít TimePicker. Aplikace pro Android se obvykle používají TimePicker
s TimePickerDialogem pro výběr časové hodnoty – to pomáhá zajistit konzistentní rozhraní napříč zařízeními a aplikacemi. TimePicker
umožňuje uživatelům vybrat denní dobu v režimu 24 hodin nebo 12 hodin denně/odp.
TimePickerDialog
je pomocná třída, která zapouzdřuje v TimePicker
dialogovém okně.
Přehled
Moderní aplikace pro Android zobrazují TimePickerDialog
dialogFragment. Aplikace tak může zobrazit TimePicker
jako automaticky otevírané dialogové okno nebo ji vložit do aktivity. Kromě toho DialogFragment
spravuje životní cyklus a zobrazení dialogového okna, což snižuje množství kódu, který je potřeba implementovat.
Tento průvodce ukazuje, jak používat TimePickerDialog
, zabalené v .DialogFragment
Ukázková aplikace zobrazí TimePickerDialog
jako modální dialogové okno, když uživatel klikne na tlačítko u aktivity. Když uživatel nastaví čas, dialogové okno se ukončí a obslužná rutina se aktualizuje TextView
na obrazovce Aktivita s časem, který byl vybrán.
Požadavky
Ukázková aplikace pro tuto příručku cílí na Android 4.1 (úroveň rozhraní API 16) nebo vyšší, ale je možné ji použít s Androidem 3.0 (úroveň rozhraní API 11 nebo vyšší). Starší verze Androidu je možné podporovat přidáním knihovny podpory Androidu v4 do projektu a některými změnami kódu.
Použití TimePickeru
Tento příklad rozšiřuje DialogFragment
; podtřídu implementace DialogFragment
hostitelů (označovaných TimePickerFragment
jako níže) a zobrazí .TimePickerDialog
Při prvním spuštění ukázkové aplikace se zobrazí tlačítko VYBRAT ČAS nad TextView
tlačítkem, které se použije k zobrazení vybraného času:
Když kliknete na tlačítko VYBRAT ČAS , ukázková aplikace se spustí TimePickerDialog
tak, jak je vidět na tomto snímku obrazovky:
V , TimePickerDialog
výběr času a kliknutí na tlačítko OK způsobí TimePickerDialog
vyvolání metody IOnTimeSetListener.OnTimeSetSet.
Toto rozhraní implementuje hostování DialogFragment
(TimePickerFragment
popsané níže). Kliknutím na tlačítko Storno dojde k zavření fragmentu a dialogového okna.
DialogFragment
vrátí vybraný čas hostitelské aktivitě jedním ze tří způsobů:
Vyvolání metody nebo nastavení vlastnosti – Aktivita může poskytnout vlastnost nebo metodu speciálně pro nastavení této hodnoty.
Vyvolání události – Může
DialogFragment
definovat událost, která bude vyvolána přiOnTimeSet
vyvolání.Pomocí –
Action
MůžeDialogFragment
vyvolatAction<DateTime>
zobrazení času v aktivitě. Aktivita poskytneAction<DateTime
při vytvářeníDialogFragment
instance .
Tato ukázka bude používat třetí techniku, která vyžaduje, aby aktivita dodá obslužnou Action<DateTime>
rutinu DialogFragment
.
Spuštění projektu aplikace
Spusťte nový projekt Pro Android s názvem TimePickerDemo (pokud neznáte vytváření projektů Xamarin.Android, přečtěte si téma Hello, Android , kde se dozvíte, jak vytvořit nový projekt).
Upravte prostředky/layout/Main.axml a nahraďte jeho obsah následujícím kódem XML:
<?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>
Toto je základní LinearLayout s TextView , který zobrazuje čas a tlačítko , které otevře TimePickerDialog
. Všimněte si, že toto rozložení používá pevně zakódované řetězce a dimenze, které aplikaci zjednoduší a usnadní pochopení – produkční aplikace pro tyto hodnoty obvykle používá prostředky (jak je vidět v příkladu kódu DatePicker ).
Upravte MainActivity.cs a nahraďte jeho obsah následujícím kódem:
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);
}
}
}
Při sestavování a spuštění tohoto příkladu by se měla zobrazit úvodní obrazovka podobná následujícímu snímku obrazovky:
Kliknutím na tlačítko VYBRAT ČAS nic nedělá, protože DialogFragment
dosud nebyl implementován k zobrazení TimePicker
.
Dalším krokem je vytvoření DialogFragment
tohoto souboru .
Rozšíření dialogového oknaFragment
Chcete-li rozšířit DialogFragment
pro použití s TimePicker
, je nutné vytvořit podtřídu, která je odvozena a DialogFragment
implementuje TimePickerDialog.IOnTimeSetListener
. Do MainActivity.cs přidejte následující třídu:
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);
}
}
Tato TimePickerFragment
třída je rozdělená na menší části a vysvětluje ji v další části.
Implementace DialogFragment
TimePickerFragment
implementuje několik metod: objekt pro vytváření, metodu vytváření instancí dialogového okna a metodu OnTimeSet
obslužné rutiny vyžadovanou TimePickerDialog.IOnTimeSetListener
.
TimePickerFragment
je podtřídou třídyDialogFragment
. ImplementujeTimePickerDialog.IOnTimeSetListener
také rozhraní (to znamená, že poskytuje požadovanouOnTimeSet
metodu):public class TimePickerFragment : DialogFragment, TimePickerDialog.IOnTimeSetListener
TAG
inicializuje se pro účely protokolování (MyTimePickerFragment lze změnit na jakýkoli řetězec, který chcete použít). AkcetimeSelectedHandler
se inicializuje na prázdného delegáta, aby se zabránilo výjimkám s nulovým odkazem:public static readonly string TAG = "MyTimePickerFragment"; Action<DateTime> timeSelectedHandler = delegate { };
Metoda
NewInstance
továrny je volána k vytvoření instance novéTimePickerFragment
. Tato metoda přebírá obslužnou rutinuAction<DateTime>
, která je vyvolána, když uživatel klikne na tlačítko OK v :TimePickerDialog
public static TimePickerFragment NewInstance(Action<DateTime> onTimeSelected) { TimePickerFragment frag = new TimePickerFragment(); frag.timeSelectedHandler = onTimeSelected; return frag; }
Když se fragment zobrazí, Android volá metodu
DialogFragment
OnCreateDialog. Tato metoda vytvoří novýTimePickerDialog
objekt a inicializuje ho aktivitou, zpětné volání objekt (což je aktuální instanceTimePickerFragment
) a aktuální čas: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; }
Když uživatel změní nastavení času v
TimePicker
dialogovém okně,OnTimeSet
vyvolá se metoda.OnTimeSet
DateTime
vytvoří objekt s použitím aktuálního data a sloučí v čase (hodina a minuta), který uživatel vybral: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);
Tento
DateTime
objekt se předá objektutimeSelectedHandler
registrovanému v okamžikuTimePickerFragment
vytvoření.OnTimeSet
vyvolá tuto obslužnou rutinu pro aktualizaci zobrazení času aktivity na vybraný čas (tato obslužná rutina je implementována v další části):timeSelectedHandler (selectedTime);
Zobrazení TimePickerFragmentu
Teď, když DialogFragment
je implementovaný, je čas vytvořit instanci DialogFragment
pomocí NewInstance
metody továrny a zobrazit ji vyvoláním DialogFragment.Show:
Přidejte následující metodu:MainActivity
void TimeSelectOnClick (object sender, EventArgs eventArgs)
{
TimePickerFragment frag = TimePickerFragment.NewInstance (
delegate (DateTime time)
{
timeDisplay.Text = time.ToShortTimeString();
});
frag.Show(FragmentManager, TimePickerFragment.TAG);
}
Po TimeSelectOnClick
vytvoření instance TimePickerFragment
vytvoří a předá delegáta pro anonymní metodu, která aktualizuje zobrazení času aktivity s předanou časovou hodnotou. Nakonec spustí fragment dialogového TimePicker
okna (prostřednictvím DialogFragment.Show
) pro zobrazení TimePicker
uživatele.
Na konec OnCreate
metody přidejte následující řádek pro připojení obslužné rutiny události k tlačítku PICK TIME , které spustí dialogové okno:
timeSelectButton.Click += TimeSelectOnClick;
Po kliknutí na TimeSelectOnClick
tlačítko VYBRAT ČAS se vyvolá, aby se uživateli zobrazil fragment dialogového TimePicker
okna.
Můžete je vyzkoušejte.
Sestavte a spusťte aplikaci. Když kliknete na tlačítko VYBRAT ČAS , TimePickerDialog
zobrazí se ve výchozím formátu času pro aktivitu (v tomto případě 12hodinový režim AM/PM):
Když v TimePicker
dialogovém okně kliknete na OK, obslužná rutina aktualizuje aktivitu TextView
zvoleným časem a pak se ukončí:
Dále přidejte následující řádek kódu bezprostředně OnCreateDialog
po is24HourFormat
deklarování a inicializaci:
is24HourFormat = true;
Tato změna vynutí, aby příznak předaný TimePickerDialog
konstruktoru byl true
použit 24hodinový režim místo formátu času hostitelské aktivity. Když aplikaci sestavíte a spustíte znovu, klikněte na tlačítko VYBRAT ČAS , TimePicker
dialogové okno se teď zobrazí ve formátu 24 hodin:
Vzhledem k tomu, že obslužná rutina volá DateTime.ToShortTimeString k tisku času do aktivity TextView
, čas se stále vytiskne ve výchozím 12hodinovém formátu AM/PM.
Shrnutí
Tento článek vysvětluje, jak zobrazit TimePicker
widget jako automaticky otevírané modální dialogové okno z aktivity Androidu. Poskytla ukázkovou DialogFragment
implementaci a probrala IOnTimeSetListener
rozhraní. Tato ukázka také ukázala, jak DialogFragment
může interakce s aktivitou hostitele zobrazit vybraný čas.