Android 日期選擇器
概觀
有時候用戶必須將數據輸入 Android 應用程式。 為了協助進行這項工作,Android 架構會提供 DatePicker
小工具與 DatePickerDialog
。 DatePicker
可讓使用者在裝置和應用程式的一致介面中選取年份、月和日。 DatePickerDialog
是將 封裝DatePicker
在對話框中的協助程序類別。
新式 Android 應用程式應該會在 中DialogFragment
顯示 DatePickerDialog
。 這可讓應用程式將 DatePicker 顯示為快顯對話框或內嵌在活動中。 此外, DialogFragment
將會管理對話框的生命週期和顯示,以減少必須實作的程式代碼數量。
本指南將示範如何使用 DatePickerDialog
包裝在 中的 DialogFragment
。 當使用者按兩下活動上的按鈕時,範例應用程式會顯示 DatePickerDialog
為強制回應對話框。 當用戶設定日期時, TextView
將會以選取的日期更新。
需求
本指南的範例應用程式是以Android 4.1 (API 層級16) 或更高版本為目標,但適用於Android 3.0(API層級11或更高版本)。 透過將 Android 支援連結庫 v4 新增至專案和某些程式代碼變更,就可以支援舊版 Android。
使用 DatePicker
此範例會擴充 DialogFragment
。 子類別將會載入並顯示 DatePickerDialog
:
當用戶選取日期並按兩下 [確定 ] 按鈕時, DatePickerDialog
會呼叫 方法 IOnDateSetListener.OnDateSet
。
裝載 會實作 DialogFragment
這個介面。 如果使用者按兩下 [ 取消] 按鈕,則片段和對話框將會自行關閉。
有數種方式 DialogFragment
可將選取的日期傳回裝載活動:
叫用方法或設定屬性 – 活動可以提供特別用來設定此值的屬性或方法。
引發事件 – 可以
DialogFragment
定義叫用時OnDateSet
將引發的事件。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.Show
用 NewInstance
。 作為具現化 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 如何與主機活動互動,以顯示選取的日期。