在某些情况下,用户必须将数据输入 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
。 此示例将使用第三种方法,并要求活动向
DialogFragment
提供
Action<DateTime>
。
扩展 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
实现 后,本部分将介绍如何在活动中使用该片段。 在本指南随附的示例应用中,活动将使用工厂方法实例化 DialogFragment
NewInstance
,然后显示它调用 DialogFragment.Show
。 作为实例化 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 如何与主机活动交互以显示所选日期。
DialogFragment
DatePicker
DatePickerDialog
DatePickerDialog.IOnDateSetListener