添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在某些情况下,用户必须将数据输入 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实现 后,本部分将介绍如何在活动中使用该片段。 在本指南随附的示例应用中,活动将使用工厂方法实例化 DialogFragmentNewInstance ,然后显示它调用 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
  •