Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 , TimePickerDialogvýběr času a kliknutí na tlačítko OK způsobí TimePickerDialog vyvolání metody IOnTimeSetListener.OnTimeSetSet.
Toto rozhraní implementuje hostování DialogFragment (TimePickerFragmentpopsané 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
DialogFragmentdefinovat událost, která bude vyvolána přiOnTimeSetvyvolání.Pomocí –
ActionMůžeDialogFragmentvyvolatAction<DateTime>zobrazení času v aktivitě. Aktivita poskytneAction<DateTimepři vytvářeníDialogFragmentinstance .
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í DialogFragmenttohoto 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.
TimePickerFragmentje podtřídou třídyDialogFragment. ImplementujeTimePickerDialog.IOnTimeSetListenertaké rozhraní (to znamená, že poskytuje požadovanouOnTimeSetmetodu):public class TimePickerFragment : DialogFragment, TimePickerDialog.IOnTimeSetListenerTAGinicializuje se pro účely protokolování (MyTimePickerFragment lze změnit na jakýkoli řetězec, který chcete použít). AkcetimeSelectedHandlerse 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
NewInstancetová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 :TimePickerDialogpublic static TimePickerFragment NewInstance(Action<DateTime> onTimeSelected) { TimePickerFragment frag = new TimePickerFragment(); frag.timeSelectedHandler = onTimeSelected; return frag; }Když se fragment zobrazí, Android volá metodu
DialogFragmentOnCreateDialog. Tato metoda vytvoří novýTimePickerDialogobjekt 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
TimePickerdialogovém okně,OnTimeSetvyvolá se metoda.OnTimeSetDateTimevytvoří 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
DateTimeobjekt se předá objektutimeSelectedHandlerregistrovanému v okamžikuTimePickerFragmentvytvoření.OnTimeSetvyvolá 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 TimePickerFragmentvytvoří 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.




