共用方式為


Android 日期選擇器

概觀

有時候用戶必須將數據輸入 Android 應用程式。 為了協助進行這項工作,Android 架構會提供 DatePicker 小工具與 DatePickerDialogDatePicker可讓使用者在裝置和應用程式的一致介面中選取年份、月和日。 DatePickerDialog是將 封裝DatePicker在對話框中的協助程序類別。

新式 Android 應用程式應該會在 中DialogFragment顯示 DatePickerDialog 。 這可讓應用程式將 DatePicker 顯示為快顯對話框或內嵌在活動中。 此外, DialogFragment 將會管理對話框的生命週期和顯示,以減少必須實作的程式代碼數量。

本指南將示範如何使用 DatePickerDialog包裝在 中的 DialogFragment。 當使用者按兩下活動上的按鈕時,範例應用程式會顯示 DatePickerDialog 為強制回應對話框。 當用戶設定日期時, TextView 將會以選取的日期更新。

Screenshot of Pick Date button followed by Date Picker dialog

需求

本指南的範例應用程式是以Android 4.1 (API 層級16) 或更高版本為目標,但適用於Android 3.0(API層級11或更高版本)。 透過將 Android 支援連結庫 v4 新增至專案和某些程式代碼變更,就可以支援舊版 Android。

使用 DatePicker

此範例會擴充 DialogFragment。 子類別將會載入並顯示 DatePickerDialog

Closeup of Date Picker dialog

當用戶選取日期並按兩下 [確定 ] 按鈕時, DatePickerDialog 會呼叫 方法 IOnDateSetListener.OnDateSet。 裝載 會實作 DialogFragment這個介面。 如果使用者按兩下 [ 取消] 按鈕,則片段和對話框將會自行關閉。

有數種方式 DialogFragment 可將選取的日期傳回裝載活動:

  1. 叫用方法或設定屬性 – 活動可以提供特別用來設定此值的屬性或方法。

  2. 引發事件 – 可以 DialogFragment 定義叫用時 OnDateSet 將引發的事件。

  3. Action 使用 – DialogFragment 可以叫Action<DateTime>用 來顯示活動中的日期。 活動會在具現化 DialogFragment時提供 Action<DateTime 。 此範例會使用第三個技術,並要求活動提供 Action<DateTime>DialogFragment

擴充 DialogFragment

顯示 DatePickerDialog 的第一個步驟是子類別 DialogFragment ,並讓它實作 IOnDateSetListener 介面:

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

NewInstance 用 方法以具現化新的 DatePickerFragment。 這個方法會採用 Action<DateTime> 當使用者按下 中的 [確定 ] 按鈕時叫用的 DatePickerDialog

顯示片段時,Android 會呼叫 方法 OnCreateDialog。 這個方法會建立新的 DatePickerDialog 物件,並使用目前的日期和回呼物件初始化它(這是 的 DatePickerFragment目前實例)。

注意

請注意,叫用時 IOnDateSetListener.OnDateSet 月份的值介於 0 到 11 之間,而不是 1 到 12 之間。 當月的日期會介於 1 到 31 的範圍內(視選取的月份而定)。

顯示 DatePickerFragment

DialogFragment現在已實作 ,本節將檢查如何使用 Activity 中的片段。 在本指南隨附的範例應用程式中,活動會使用 Factory 方法具現化 DialogFragment ,然後顯示它叫DialogFragment.ShowNewInstance 。 作為具現化 DialogFragment的一部分,活動會傳遞 Action<DateTime>,這會在 活動所裝載的 中 TextView 顯示日期:

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

摘要

此範例討論如何將小工具顯示為 DatePicker Android活動的快顯模式對話框。 它提供了範例 DialogFragment 實作,並討論了 IOnDateSetListener 介面。 此範例也會示範 DialogFragment 如何與主機活動互動,以顯示選取的日期。