Výběr data v Androidu
Přehled
Existují situace, kdy uživatel musí zadat data do aplikace pro Android. Pro usnadnění tohoto, Android framework poskytuje DatePicker
widget a rozhraní DatePickerDialog
. Umožňuje DatePicker
uživatelům vybrat rok, měsíc a den v konzistentním rozhraní napříč zařízeními a aplikacemi. Je DatePickerDialog
pomocná třída, která zapouzdřuje DatePicker
v dialogovém okně.
Moderní aplikace pro Android by měly zobrazovat DatePickerDialog
v souboru DialogFragment
. To umožní aplikaci zobrazit DatePicker jako automaticky otevírané dialogové okno nebo vložené do aktivity. Kromě toho DialogFragment
bude spravovat životní cyklus a zobrazení dialogového okna, což snižuje množství kódu, který je potřeba implementovat.
Tento průvodce předvede, jak používat DatePickerDialog
, zabalené do DialogFragment
. Ukázková aplikace zobrazí DatePickerDialog
modální dialogové okno, když uživatel klikne na tlačítko u aktivity. Když uživatel nastaví datum, TextView
aktualizuje se s datem, které bylo vybráno.
Požadavky
Ukázková aplikace pro tuto příručku cílí na Android 4.1 (úroveň rozhraní API 16) nebo vyšší, ale platí pro Android 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í DatePickeru
Tato ukázka se rozšíří DialogFragment
. Podtřída bude hostitelem a zobrazením DatePickerDialog
:
Když uživatel vybere datum a klikne na tlačítko OK , DatePickerDialog
zavolá metodu IOnDateSetListener.OnDateSet
.
Toto rozhraní je implementováno hostitelem DialogFragment
. Pokud uživatel klikne na tlačítko Storno , pak fragment a dialogové okno se zavře.
Existuje několik způsobů, jak DialogFragment
se vybrané datum může vrátit do aktivity hostování:
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řiOnDateSet
vyvolání.Použití –
Action
MůžeDialogFragment
vyvolatAction<DateTime>
zobrazení data v aktivitě. Aktivita poskytneAction<DateTime
při vytvářeníDialogFragment
instance . V této ukázce se použije třetí technika a vyžaduje, aby aktivita doAction<DateTime>
objektuDialogFragment
.
Rozšíření dialogového oknaFragment
Prvním krokem při zobrazení DatePickerDialog
podtřídy DialogFragment
je její implementace IOnDateSetListener
rozhraní:
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);
}
}
Metoda NewInstance
je vyvolána k vytvoření instance nové DatePickerFragment
. Tato metoda vezme Action<DateTime>
, která bude vyvolána, když uživatel klikne na tlačítko OK v sadě DatePickerDialog
.
Při zobrazení fragmentu bude Android volat metodu OnCreateDialog
. Tato metoda vytvoří nový DatePickerDialog
objekt a inicializuje jej s aktuálním datem a zpětné volání objekt (což je aktuální instance DatePickerFragment
).
Poznámka:
Mějte na paměti, že hodnota měsíce, kdy IOnDateSetListener.OnDateSet
je vyvolána, je v rozsahu od 0 do 11, a ne 1 až 12. Den v měsíci bude v rozsahu od 1 do 31 (podle toho, který měsíc byl vybrán).
Zobrazení datePickerFragmentu
DialogFragment
Po implementaci této části se podíváme, jak použít fragment v aktivitě. V ukázkové aplikaci, která doprovází tuto příručku, aktivita vytvoří instanci DialogFragment
pomocí NewInstance
metody továrny a pak zobrazí vyvolání DialogFragment.Show
. Jako součást vytvoření instance DialogFragment
aktivity předá Action<DateTime>
, která zobrazí datum v TextView
hostované aktivitě:
[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);
}
}
Shrnutí
Tato ukázka popisuje, jak zobrazit DatePicker
widget jako automaticky otevírané modální dialogové okno jako součást aktivity Androidu. Poskytla ukázkovou implementaci DialogFragment a probrala IOnDateSetListener
rozhraní. Tato ukázka také ukázala, jak dialogFragment může pracovat s aktivitou hostitele k zobrazení vybraného data.