将EditText作为参数传递时为空引用异常

时间:2014-12-22 01:10:22

标签: android xamarin xamarin.android

我目前在下面调用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 ();
    }

1 个答案:

答案 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}}事件,并处理该处的数据。