在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)提示方法已过时。
解决方案
问题根源
Android.Support.V4.App.DialogFragment没有OnCreateDialog(int)这个带参数的重写方法,该方法属于Activity类,因此会报CS0115错误;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
相关产品推荐
相关产品推荐

