Aracılığıyla paylaş


Android Zaman Seçici

Kullanıcının bir saat seçmesi için bir yol sağlamak için TimePicker'ı kullanabilirsiniz. Android uygulamaları genellikle bir zaman değeri seçmek için TimePickerDialog ile birlikte kullanılırTimePicker; bu, cihazlar ve uygulamalar arasında tutarlı bir arabirim sağlamaya yardımcı olur. TimePicker kullanıcıların günün saatini 24 saat veya 12 saatlik AM/PM modunda seçmesine olanak tanır. TimePickerDialog , bir iletişim kutusunda öğesini TimePicker kapsülleyen bir yardımcı sınıfıdır.

Zaman Seçici İletişim Kutusu'nun çalışmadaki örnek ekran görüntüsü

Genel bakış

Modern Android uygulamaları bir DialogFragment içinde öğesini görüntülerTimePickerDialog. Bu, bir uygulamanın açılan iletişim kutusu olarak görüntülemesini TimePicker veya bir Etkinlik içine eklemesini mümkün kılar. Buna ek olarak, DialogFragment iletişim kutusunun yaşam döngüsünü ve görünümünü yönetir ve uygulanması gereken kod miktarını azaltır.

Bu kılavuzda, içinde sarmalanmış olarak nasıl kullanılacağı TimePickerDialoggösterilmektedir DialogFragment. Kullanıcı etkinlik üzerindeki bir düğmeye TimePickerDialog tıkladığında örnek uygulama bunu kalıcı bir iletişim kutusu olarak görüntüler. Saat kullanıcı tarafından ayarlandığında, iletişim kutusundan çıkar ve bir işleyici etkinlik ekranında seçili olan saati güncelleştirir TextView .

Gereksinimler

Bu kılavuz için örnek uygulama Android 4.1 (API düzeyi 16) veya üzerini hedefler, ancak Android 3.0 (API düzeyi 11 veya üzeri) ile kullanılabilir. Android Destek Kitaplığı v4'ün projeye eklenmesi ve bazı kod değişiklikleri ile Android'in eski sürümlerini desteklemek mümkündür.

TimePicker kullanma

Bu örnek genişletir; alt sınıf uygulaması DialogFragment (aşağıda adlandırılırTimePickerFragment) konaklar DialogFragmentve görüntülerTimePickerDialog. Örnek uygulama ilk kez başlatıldığında, seçili saati görüntülemek için kullanılacak bir TextView pick TIME düğmesinin üzerinde görüntülenir:

İlk örnek uygulama ekranı

SAAT SEÇ düğmesine tıkladığınızda, örnek uygulama şu ekran görüntüsünde görüldüğü gibi uygulamasını TimePickerDialog başlatır:

Uygulama tarafından görüntülenen varsayılan Zaman Seçici iletişim kutusunun ekran görüntüsü

TimePickerDialogiçinde bir saat seçip Tamam düğmesine tıklanması, öğesinin TimePickerDialog IOnTimeSetListener.OnTimeSet yöntemini çağırmasına neden olur. Bu arabirim barındırma DialogFragment tarafından uygulanır (TimePickerFragmentaşağıda açıklanmıştır). İptal düğmesine tıkladığınızda parça ve iletişim kutusu kapatılır.

DialogFragment seçilen zamanı barındırma Etkinliği'ne üç yoldan biriyle döndürür:

  1. Bir yöntemi çağırma veya özellik ayarlama – Etkinlik, özellikle bu değeri ayarlamak için bir özellik veya yöntem sağlayabilir.

  2. Olay oluşturmaDialogFragment çağrıldığında OnTimeSet tetiklenecek bir olayı tanımlayabilir.

  3. Action kullanarak : DialogFragment , etkinlikte saati görüntülemek için bir Action<DateTime> çağırabilir. Etkinliği, örneği oluştururken öğesini DialogFragmentsağlarAction<DateTime.

Bu örnek, Activity öğesinin öğesine bir Action<DateTime> işleyici DialogFragmentsağlamasını gerektiren üçüncü tekniği kullanır.

Uygulama Projesi Başlatma

TimePickerDemo adlı yeni bir Android projesi başlatın (Xamarin.Android projeleri oluşturmayı bilmiyorsanız, yeni bir proje oluşturmayı öğrenmek için bkz. Merhaba, Android).

Resources/layout/Main.axml dosyasını düzenleyin ve içeriğini aşağıdaki XML ile değiştirin:

<?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>

Bu, saati görüntüleyen bir TextView ve öğesini açan bir Düğme içeren temel bir LinearLayout'tırTimePickerDialog. Bu düzenin, uygulamayı daha basit ve kolay anlaşılır hale getirmek için sabit kodlanmış dizeler ve boyutlar kullandığını unutmayın. Üretim uygulaması normalde bu değerler için kaynakları kullanır (DatePicker kod örneğinde görüldüğü gibi).

MainActivity.cs düzenleyin ve içeriğini aşağıdaki kodla değiştirin:

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);
        }
    }
}

Bu örneği derleyip çalıştırdığınızda, aşağıdaki ekran görüntüsüne benzer bir başlangıç ekranı görmeniz gerekir:

İlk Uygulama ekranı

PICK TIME düğmesine tıklanması hiçbir şey yapmaz çünkü DialogFragment öğesini görüntülemek TimePickeriçin henüz uygulanmamıştır. Sonraki adım, bunu DialogFragmentoluşturmaktır.

DialogFragment Genişletiyor

ile TimePickerkullanmak üzere genişletmek DialogFragment için, 'den DialogFragment türetilen ve uygulayan TimePickerDialog.IOnTimeSetListenerbir alt sınıf oluşturmak gerekir. aşağıdaki sınıfı MainActivity.cs ekleyin:

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);
    }
}

Bu TimePickerFragment sınıf daha küçük parçalara ayrılmıştır ve sonraki bölümde açıklanmıştır.

DialogFragment Uygulaması

TimePickerFragment çeşitli yöntemler uygular: bir fabrika yöntemi, bir İletişim kutusu örnekleme yöntemi ve OnTimeSet tarafından TimePickerDialog.IOnTimeSetListenergereken işleyici yöntemi.

  • TimePickerFragment , öğesinin bir alt sınıfıdır DialogFragment. Ayrıca arabirimini uygular TimePickerDialog.IOnTimeSetListener (yani gerekli OnTimeSet yöntemi sağlar):

    public class TimePickerFragment : DialogFragment, TimePickerDialog.IOnTimeSetListener
    
  • TAG günlüğe kaydetme amacıyla başlatılır (MyTimePickerFragment , kullanmak istediğiniz dizeye değiştirilebilir). Eylem timeSelectedHandler , null başvuru özel durumlarını önlemek için boş bir temsilciye başlatılır:

    public static readonly string TAG = "MyTimePickerFragment";
    Action<DateTime> timeSelectedHandler = delegate { };
    
  • Yeni NewInstance TimePickerFragmentbir örneği oluşturmak için fabrika yöntemi çağrılır. Bu yöntem, kullanıcı içindeki Tamam düğmesine tıkladığında çağrılan bir Action<DateTime> işleyici TimePickerDialogalır:

    public static TimePickerFragment NewInstance(Action<DateTime> onTimeSelected)
    {
        TimePickerFragment frag = new TimePickerFragment();
        frag.timeSelectedHandler = onTimeSelected;
        return frag;
    }
    
  • Parça görüntülendiğinde Android, OnCreateDialog yöntemini çağırırDialogFragment. Bu yöntem yeni TimePickerDialog bir nesne oluşturur ve bunu Activity, geri çağırma nesnesi (geçerli örneği TimePickerFragment) ve geçerli saatle başlatır:

    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;
    }
    
  • Kullanıcı iletişim kutusundaki zaman ayarını TimePicker değiştirdiğinde yöntemi OnTimeSet çağrılır. OnTimeSet geçerli tarihi kullanarak bir DateTime nesne oluşturur ve kullanıcı tarafından seçilen saat (saat ve dakika) içinde birleştirilir:

    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);
    
  • Bu DateTime nesne, oluşturma zamanında nesneyle kaydedilen öğesine TimePickerFragment geçirilirtimeSelectedHandler. OnTimeSet Bu işleyiciyi çağırarak Etkinliğin zaman görüntüsünü seçili saate güncelleştirir (bu işleyici sonraki bölümde uygulanır):

    timeSelectedHandler (selectedTime);
    

TimePickerFragment'ı görüntüleme

artık uygulaması uygulandığına göreDialogFragment, artık factory yöntemini kullanarak NewInstance örneği oluşturmanın DialogFragment ve DialogFragment.Show komutunu çağırarak görüntülemenin zamanı geldi:

aşağıdaki yöntemi içine MainActivityekleyin:

void TimeSelectOnClick (object sender, EventArgs eventArgs)
{
    TimePickerFragment frag = TimePickerFragment.NewInstance (
        delegate (DateTime time)
        {
            timeDisplay.Text = time.ToShortTimeString();
        });

    frag.Show(FragmentManager, TimePickerFragment.TAG);
}

örneği eklendikten TimePickerFragmentsonraTimeSelectOnClick, Activity'in zaman görüntüsünü geçirilen saat değeriyle güncelleştiren anonim bir yöntem için bir temsilci oluşturur ve geçirir. Son olarak, kullanıcıya görüntülemek TimePicker için iletişim kutusu parçasını (aracılığıylaDialogFragment.Show) başlatırTimePicker.

Yöntemin OnCreate sonuna, olay işleyicisini iletişim kutusunu başlatan PICK TIME düğmesine eklemek için aşağıdaki satırı ekleyin:

timeSelectButton.Click += TimeSelectOnClick;

SEÇ ZAMANI düğmesine tıklandığında, TimeSelectOnClick kullanıcıya iletişim kutusu parçasını görüntülemek TimePicker için çağrılır.

Deneyin!

Uygulamayı derleyin ve çalıştırın. PICK TIME düğmesine tıkladığınızda, TimePickerDialog etkinliğin varsayılan saat biçiminde görüntülenir (bu durumda, 12 saatlik AM/PM modu):

Zaman İletişim Kutusu AM/PM modunda görüntülenir

İletişim kutusunda Tamam'a TimePicker tıkladığınızda işleyici, Etkinlik'leri TextView seçilen saatle güncelleştirir ve ardından şu tarihten çıkar:

Etkinlik TextView'da A/M zamanı görüntülenir

Ardından, aşağıdaki kod satırını bildirildikten ve başlatıldıktan hemen sonraya OnCreateDialog is24HourFormat ekleyin:

is24HourFormat = true;

Bu değişiklik, oluşturucuya true geçirilen bayrağı barındırma Etkinliğinin TimePickerDialog zaman biçimi yerine 24 saat modunun kullanılmasına zorlar. Uygulamayı yeniden derleyip çalıştırdığınızda, ZAMAN SEÇ düğmesine tıklayın, TimePicker iletişim kutusu artık 24 saat biçiminde görüntülenir:

24 Saat biçiminde TimePicker iletişim kutusu

İşleyici, Saati Etkinliğin TextViewzamanına yazdırmak için DateTime.ToShortTimeString'i çağırdığından, saat yine de varsayılan 12 saatlik AM/PM biçiminde yazdırılır.

Özet

Bu makalede, bir pencere öğesinin TimePicker Android Etkinliği'nden açılan bir kalıcı iletişim kutusu olarak nasıl görüntüleneceği açıklanmıştır. Örnek DialogFragment bir uygulama sağladı ve arabirimini IOnTimeSetListener tartıştı. Bu örnek, seçilen saati görüntülemek için konak Etkinliği ile nasıl DialogFragment etkileşim kurabileceğini de göstermiştir.