我目前在下面调用sendChildInfoToMainForm()时在Xamarin.Android中获得了一个空引用异常。在传递任何对象之前操作它的属性没有问题,并且当抛出异常时,检查器不会将任何对象显示为null。任何想法可能会发生在这里?我很困惑,虽然我觉得它一定很简单。
public override Android.Views.View OnCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
var view = inflater.Inflate(Resource.Layout.popupAddChild, container, true);
Dialog.SetTitle ("New Child");
EditText childFirstName_editText = view.FindViewById<EditText> (Resource.Id.editTextChildFirstName);
DatePicker childDOB_datePicker = view.FindViewById<DatePicker> (Resource.Id.datePickerChidDOB);
Button submitChild = view.FindViewById<Button> (Resource.Id.buttonAddChild);
childDOB_datePicker.SpinnersShown = true;
//set up min and max dates
DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
TimeSpan diff = System.DateTime.UtcNow.AddYears(-26) - origin;
childDOB_datePicker.MinDate = (long) Math.Floor(diff.TotalSeconds);
//wire up the button
submitChild.Click += delegate { sendChildInfoToMainForm(childFirstName_editText, childDOB_datePicker); };
return view;
}
private void sendChildInfoToMainForm(EditText kidName, DatePicker kidDOB)
{
((AddMemberActivity) this.Activity).currentNewMember.childName1 = kidName.Text;
((AddMemberActivity) this.Activity).currentNewMember.childDOB1 = kidDOB.DateTime.ToShortDateString();
Dismiss ();
}
答案 0 :(得分:1)
放入一个断点并调试你的方法。我怀疑它实际上不是kidName
也不是kidDOB
是空的,而是你的疯狂投射和你假设你可以像Activity
那样设置你的数据。
实现目标的更好方法是让DialogFragment
对显示它的Activity
一无所知。如果您需要在某些时候执行此操作,这也可以更轻松地在Activity
中的其他位置重复使用它。
所以不要使用方法sendChildInfoToMainForm
。我会创建一个事件,传递实际数据,以便Activity
可以处理如何处理它,而不是给DialogFragment
这个责任。
public class ChildDialogEventArgs : EventArgs {
public string Name { get; set; }
public DateTime DateOfBirth { get; set; }
}
public delegate void ChildDialogEventHandler(object sender, ChildDialogEventArgs e);
然后在DialogFragment
:
public event ChildDialogEventHandler Changed;
然后在Click
事件中执行此操作:
submitChild.Click += (_, __) => {
var handler = Changed;
if (handler != null)
handler(this, new ChildDialogEventArgs {
Name = childFirstName_editText.Text,
DateOfBirth = childDOB_datePicker.DateTime
});
}
然后在您的Activity
中,您只需订阅Changed
的{{1}}事件,并处理该处的数据。