Sdílet prostřednictvím


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.

Screenshot of Pick Date button followed by Date Picker dialog

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:

Closeup of Date Picker dialog

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í:

  1. Vyvolání metody nebo nastavení vlastnosti – Aktivita může poskytnout vlastnost nebo metodu speciálně pro nastavení této hodnoty.

  2. Vyvolání události – Může DialogFragment definovat událost, která bude vyvolána při OnDateSet vyvolání.

  3. Použití – Action Může DialogFragment vyvolat Action<DateTime> zobrazení data v aktivitě. Aktivita poskytne Action<DateTime při vytváření DialogFragmentinstance . V této ukázce se použije třetí technika a vyžaduje, aby aktivita do Action<DateTime> objektu DialogFragment.

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 DialogFragmentaktivity 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.