You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C# Xamarin Android Fragment中正确显示DatePickerDialog的方法

问题:Xamarin Android Fragment中正确调用DatePickerDialog的方法

在Xamarin Android的AddEventFragment中设置EditText和按钮触发DatePickerDialog时遇到以下问题:

  • 调用ShowDialog()报错,重写OnCreateDialog(int)方法提示CS0115错误(无合适重写方法);
  • 使用this.Activity.ShowDialog(DatePickerDialogID)无语法错误,但提示方法已过时。

原代码示例

namespace AdamsonsEDApp.Fragments
{
    public class AddEventFragment : Android.Support.V4.App.DialogFragment, Android.App.DatePickerDialog.IOnDateSetListener
    {
        private int year, month, day;
        TextInputLayout eventdatesetTextt;
        Button eventpickdateButton;

        public override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
        }

        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            View view = inflater.Inflate(Resource.Layout.newevent, container, false);
            this.Dialog.SetCanceledOnTouchOutside(false);
            eventdatesetText = (TextInputLayout)view.FindViewById(Resource.Id.eventdatesetText);
            eventpickdateButton = (Button)view.FindViewById(Resource.Id.eventpickdateButton);

            eventpickdateButton.Click += EventpickdateButton_Click;
            return view;
        }

        private void EventpickdateButton_Click(object sender, EventArgs e)
        {
            int DatePickerDialogID = 1;
            ShowDialog(DatePickerDialogID);
        }

        public override Dialog OnCreateDialog(int id)
        {
            if (id == 1)
            {
                return new Android.App.DatePickerDialog(this.Activity, this, year, month, day);
            }
            return null;
        }

        public void OnDateSet(DatePicker view, int year, int month, int dayOfMonth)
        {
            this.year = year;
            this.month = month;
            this.day = dayOfMonth;
            eventdatesetText.EditText.Text = year + "/" + month + "/" + dayOfMonth;
        }
    }
}

尝试的替代代码

private void EventpickdateButton_Click(object sender, EventArgs e)
{
    int DatePickerDialogID = 1;
    this.Activity.ShowDialog(DatePickerDialogID);
}

错误信息

  • ShowDialog()调用报错,提示ShowsDialog()也错误;
  • OnCreateDialog(int)方法提示CS0115错误:无合适方法可重写;
  • this.Activity.ShowDialog(DatePickerDialogID)提示方法已过时。

解决方案

问题根源

  1. Android.Support.V4.App.DialogFragment没有OnCreateDialog(int)这个带参数的重写方法,该方法属于Activity类,因此会报CS0115错误;
  2. ShowDialog()是Activity的旧API,已被废弃,Fragment中不应使用这种方式触发对话框。

正确实现方式

直接在按钮点击事件中实例化DatePickerDialog并显示,同时初始化默认日期(比如当前系统日期):

修改后的完整代码

namespace AdamsonsEDApp.Fragments
{
    public class AddEventFragment : Android.Support.V4.App.DialogFragment, Android.App.DatePickerDialog.IOnDateSetListener
    {
        private int year, month, day;
        TextInputLayout eventdatesetText;
        Button eventpickdateButton;

        public override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            // 初始化默认日期为当前日期
            var calendar = Calendar.Instance;
            year = calendar.Get(CalendarField.Year);
            month = calendar.Get(CalendarField.Month);
            day = calendar.Get(CalendarField.DayOfMonth);
        }

        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            View view = inflater.Inflate(Resource.Layout.newevent, container, false);
            this.Dialog.SetCanceledOnTouchOutside(false);
            eventdatesetText = (TextInputLayout)view.FindViewById(Resource.Id.eventdatesetText);
            eventpickdateButton = (Button)view.FindViewById(Resource.Id.eventpickdateButton);

            eventpickdateButton.Click += EventpickdateButton_Click;
            return view;
        }

        private void EventpickdateButton_Click(object sender, EventArgs e)
        {
            // 直接创建DatePickerDialog并显示
            var datePickerDialog = new Android.App.DatePickerDialog(Activity, this, year, month, day);
            datePickerDialog.Show();
        }

        public void OnDateSet(DatePicker view, int year, int month, int dayOfMonth)
        {
            this.year = year;
            this.month = month;
            this.day = dayOfMonth;
            // 月份从0开始,显示时+1更符合用户习惯
            eventdatesetText.EditText.Text = $"{year}/{month + 1}/{dayOfMonth}";
        }
    }
}

关键修改点

  • 在OnCreate中初始化默认日期为当前系统日期,避免初始值为0导致显示异常;
  • 移除错误的OnCreateDialog(int)重写方法;
  • 按钮点击事件中直接实例化DatePickerDialog并调用Show()显示;
  • 日期显示时将月份+1(因为Android的DatePicker返回的月份从0开始)。

内容的提问来源于stack exchange,提问作者Zeno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 13:40:26