Sdílet prostřednictvím


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

Ukázkový snímek obrazovky s dialogovým oknem Pro výběr času v akci

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:

Úvodní obrazovka ukázkové aplikace

Když kliknete na tlačítko VYBRAT ČAS , ukázková aplikace se spustí TimePickerDialog tak, jak je vidět na tomto snímku obrazovky:

Snímek obrazovky s výchozím dialogovým oknem Pro výběr času zobrazeným aplikací

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

  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 OnTimeSet vyvolání.

  3. Pomocí – Action Může DialogFragment vyvolat Action<DateTime> zobrazení času v aktivitě. Aktivita poskytne Action<DateTime př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:

Úvodní obrazovka aplikace

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.

  • TimePickerFragment je podtřídou třídy DialogFragment. Implementuje TimePickerDialog.IOnTimeSetListener také rozhraní (to znamená, že poskytuje požadovanou OnTimeSet 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). Akce timeSelectedHandler 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í instance TimePickerFragment) 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. OnTimeSetDateTime 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á objektu timeSelectedHandler registrovanému v okamžiku TimePickerFragment 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 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):

Dialogové okno Čas se zobrazí v režimu AM/PM.

Když v TimePicker dialogovém okně kliknete na OK, obslužná rutina aktualizuje aktivitu TextView zvoleným časem a pak se ukončí:

Čas A/M se zobrazí v zobrazení TextView aktivity.

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:

Dialogové okno TimePicker 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.